【发布时间】:2015-12-31 15:15:01
【问题描述】:
我对 c++11 移动语义感到非常困惑,尤其是特征 - 它是否有右值的赋值运算符 (operator=(Type&&))?
此代码因大小不匹配而崩溃:
Eigen::VectorXd&& func(){
Eigen::VectorXd&& v=Eigen::VectorXd::Zero(5);
return std::move(v);
}
Eigen::VectorXd v=Eigen::VectorXd::Zero(10);
v.block(0,0,5,1)=func();
唯一的工作方式是如果 func 被定义为:
Eigen::VectorXd func(){
Eigen::VectorXd v=Eigen::VectorXd::Zero(5);
return v;
}
即使是常规的单一引用 (&) 也不起作用。我什么时候可以使用这些参考资料?内存怎么了? 谢谢!
【问题讨论】:
-
完全正确,应该按值返回。除非您想返回对无论引用如何都存在的对象的引用,否则按值返回。引用是指对象。如果您无法显示该对象,则您的参考资料无法引用。我是否已经提到您应该按价值返回?
-
不返回对具有自动存储持续时间的对象(“局部变量”)的引用。右值引用不会改变这一点,这一直是被禁止的。
-
好的,我知道通过常规引用返回是一个坏主意,因为该对象不存在于函数之外。感谢那。粗略地说,它会按价值工作-没有理由不应该这样做,但是所有这些复制!
-
@user2070148 不,就是这样。返回的对象是一个右值(标准要求
return语句首先尝试移动),因此按值返回通常会触发移动,而不是副本。 -
std::move 东西使对象移动并存在于函数之外,但可能没有与 Rvalue-reference 一起使用的赋值运算符。虽然我认为有一个复制构造函数。我尝试了第一个 func(使用 &&),而不是将其分配给现有块,而是将其分配给 Eigen::VectorXd v1 = func();- 它有效
标签: c++ c++11 eigen move-semantics rvalue-reference