假设您想利用移动语义,但是您的一个可移动类需要成为std::pair
的一部分。 目的是创建一个函数,返回可以被视为 rvalue 并转发的 std::pair
。
但我无法看出如何实现这一点,除非对std::pair
本身进行内部更改,使其了解移动语义。
考虑以下代码:
struct Foo
{
Foo() { }
Foo(Foo&& f) { }
private:
Foo(const Foo& f) { } // do not allow copying
};
int main()
{
Foo f;
std::pair<Foo, int> res = std::make_pair(f, 10); // fails due to private copy constructor
}
问题在于 std::make_pair
和 std::pair
构造函数本身都会接受两个对象并尝试制作它们的内部副本。这将导致尝试调用复制构造函数。但在我的示例中,我希望能够将新的 pair 对象移动到 res
中,并确保不进行任何拷贝操作。我认为除非std::pair
本身内部定义以下构造函数,否则不可能实现这一点:pair(T1&& t1, T2&& t2) : first(std::move(t1)), second(std::move(t2))
但是在我使用的编译器(gcc 4.3.2)上似乎不行。可能是我的编译器版本太旧了,在更新版本中实际上会有这个支持移动语义的构造函数。但是我对移动语义的理解有些模糊,所以我不确定是否漏掉了什么。那么,我尝试做的事情是不是可能的,而不必重新实现 std::pair
?还是说我的编译器过时了?