![](/img/trans.png)
[英]How do I have a const member move-only object without making my object copyable?
[英]Return a move-only object from member function
我在理解+使用C ++中的移动语义方面遇到了困难。 我有一个对象Variable
实现了move构造函数和move分配,但是没有copy构造函数和赋值。 通常,复制Variable
没有任何意义,我想明确禁止复制。
class Variable {
public:
// ctod/dtor things
Variable(Variable&&);
Variable& operator =(Variable&&);
// ...
};
问题是从函数返回Variable
正确方法是什么?
Variable& UserObject::giveMeYourVariable() {
// Calculate parameters
Variable v(/* Some parameters */);
return v; // <=== warning: reference to local variable 'v' returned
}
在另一个代码中:
UserObject x* = new UserObject;
Variable v = std::move(x->giveMeYourVariable())
上面的代码编译没有错误,但发出有关返回对局部变量的引用的警告。 此代码是否会泄漏内存或导致未定义的行为或返回已删除的引用? 怎么了?
更新
在初始化引用类型时(在解析器生成器生成的代码内部),按值返回会导致错误:
Variable& tmp (this->a_function()); <<== error
错误提示:
error: invalid initialization of non-const reference of type 'Variable&' \\
from an rvalue of type 'Variable'
您的程序调用未定义的行为。
正如编译器已经告诉您的那样,您的Variable
对象的生存期仅限于函数调用,并且在调用之后返回的引用不再有效。
您可以简单地按值返回Variable
对象
Variable UserObject::giveMeYourVariable() {
并愉快地移动它。
您应该移动两次,然后按值返回Variable对象:
#include <utility>
class Variable {
public:
// ctod/dtor things
Variable() {}
Variable(Variable&&) {}
Variable& operator =(Variable&&) {return *this;}
// ...
};
Variable foo() {
Variable v;
return std::move(v);
}
int main() {
Variable v = std::move(foo());
return 0;
}
std :: move只需将类型从Variable切换为Variable &&,即可使用移动语义调用构造函数
所以:
第一个std :: move允许创建临时对象以返回
第二个std :: mode允许创建变量v
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.