1

我很难理解 + 在 C++ 中使用移动语义。我有一个对象Variable实现了移动构造函数和移动赋值,但没有复制构造函数和赋值。通常复制 aVariable没有意义,我想明确禁止复制。

class Variable {
public:
    // ctod/dtor things
    Variable(Variable&&);
    Variable& operator =(Variable&&);
    // ...
};

Variable问题是从函数返回 a 的正确方法是什么?

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 邮件列表中报告,并将在下一版本中解决。

4

2 回答 2

4

您的程序调用未定义的行为。
正如编译器已经告诉您的那样,您的Variable对象的生命周期仅限于函数调用,并且您返回的引用在调用后不再有效。

您可以简单地Variable按值返回您的对象

Variable UserObject::giveMeYourVariable() {

并愉快地移动它。

于 2013-08-05T10:05:06.500 回答
-3

您应该移动两次并按值返回变量对象:

#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 只是将类型从变量切换到变量&&,允许调用具有移动语义的构造函数

所以:

第一个 std::move 允许创建临时对象以返回

第二个 std::mode 允许创建变量 v

于 2013-08-05T10:34:10.150 回答