移动分配和引用成员

the*_*use 16 c++ move-semantics c++11

具有引用成员变量的类的复制赋值是禁止的,因为您无法重新分配引用.但是移动分配怎么样?我只是尝试了move它,当然,当我只想移动引用本身时,它会破坏源对象:

class C
{
public:
    C(X& x) : x_(x) {}
    C(C&& other) : x_(std::move(other.x_)) {}
    C& operator=(C&& other)
    {
        x_ = std::move(other.x_);
    }
private:
    X& x_;
};

X y;
C c1(y);

X z;
C c2(z);

c2 = c1; // destroys y as well as z
Run Code Online (Sandbox Code Playgroud)

我不应该只是实施移动分配并坚持使用移动构造吗?这swap(C&, C&)很难实现.

Lui*_*uca 19

(根据OP的建议作为评论的答案发布)

一般来说,如果一个人想要用C++中的引用做一些非平凡的东西,那么就会使用它reference_wrapper<T>,这实际上是a的一种奇特的价值语义替代T&,然后就可以用它完成 - 它已经提供了(重新)赋值和其他操作.我敢肯定,这会使移动构造函数和赋值变得非常平凡,如果不是微不足道的(请注意不是trivial按照is_trivially_*语义).

"参考包装器"作为TR1的一部分添加到C++ 03中,是C++ 11的一部分.

文档:http://en.cppreference.com/w/cpp/utility/functional/reference_wrapper

  • `reference_wrapper` 是不可移动的,所以这并不能真正解决问题。据我所知,如果您希望您的类包含引用并且可移动,则必须使用指针。 (3认同)