C++ 移动分配和引用成员

C++ 移动分配和引用成员,c++,c++11,move-semantics,C++,C++11,Move Semantics,对于具有引用成员变量的类,复制分配为否,因为您无法重新分配引用。但是搬家作业呢?我试图简单地moveing它,但是,当然,当我只想移动引用本身时,这会破坏源对象: class C { public: C(X& x) : x_(x) {} C(C&& other) : x_(std::move(other.x_)) {} C& operator=(C&& other) { x_ = std::move(

对于具有引用成员变量的类,复制分配为否,因为您无法重新分配引用。但是搬家作业呢?我试图简单地
move
ing它,但是,当然,当我只想移动引用本身时,这会破坏源对象:

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

我是否应该不执行搬家任务,只坚持搬家施工?这使得
swap(C&,C&)
很难实现。

从某种意义上说,引用是一个
T*const
,上面有语法糖,可以自动解除限制、自动捕获和自动延长生存时间。(请注意,这并不完全正确,但通常是在实践和实践中)

如果你想要一个可恢复的引用,C++有:它们被称为指针。如果愿意,可以使用访问器用函数调用替换取消引用。难以模仿的剩余功能(临时生存期延长)不适用于

struct
成员。

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


一般来说,如果想用C++中的引用做一些不平凡的事情,则使用的是 RealthyWrxBux/Cuff>,它本质上是一个“值代码”语义站,用于“代码> T和<代码>,然后将完成它——它已经提供(重新)赋值和其他操作。我确信这会使move构造函数和赋值变得几乎微不足道,如果不是微不足道的话(请注意,不

微不足道的
,如
is\u平凡的
语义所示)

“引用包装器”作为TR1的一部分添加到C++03中,并且是C++11的一部分


文档:

一般来说,如果一个人想用引用来做一些琐碎的事情,难道他不应该使用
reference\u包装器来完成它吗?我确信这会使move构造函数和赋值变得几乎微不足道,如果不是微不足道的话(请注意not
triple
)。@LuisMachuca这似乎是可行的。如果你加上它作为答案,我会投赞成票。谢谢。你有点错过了
x.
…@ildjarn的声明哇!现在修好了。谢谢。@thehouse-注意到并完成了,谢谢。指针的语义比可重置引用弱。例如,您可以将
NULL
分配给它们。更重要的是,它们根本不记录意图(编写要读取的代码而不是执行的代码等)。值得将注释升级为答案,这样我们就有了更明显的上/下投票按钮
reference\u wrapper
是不可移动的,所以这并不能真正解决问题。据我所知,如果你想让你的类包含一个引用并且是可移动的,你必须使用一个指针。@Nemo一个包含
std::reference\u包装的类
也可以有一个由右值构成的复制构造函数/一个由右值构成的赋值操作符,那么这难道不能回答原来的问题吗?在上述情况下,它将允许您使用所有默认值,使用零规则。