繁体   English   中英

从成员函数返回仅移动对象

[英]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'

更新2
XSD邮件列表中报告了此问题,并将在下一版本中解决

您的程序调用未定义的行为。
正如编译器已经告诉您的那样,您的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM