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