【发布时间】:2013-08-05 09:54:43
【问题描述】:
我在 C++ 中理解 + 使用移动语义时遇到了困难。我有一个对象Variable 实现了移动构造函数和移动赋值,但没有复制构造函数和赋值。一般复制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'
【问题讨论】:
-
返回对本地的引用会导致未定义的行为,无论您是否使用移动语义。 Stop stealing hotel room keys!
-
我明白了。所以我收集到的是,在没有复制构造函数的情况下实现移动构造函数并不是一个好主意。对吗?
-
这个结论毫无意义。你为什么会这样想? (有关此类课程的教科书示例,请参阅
unique_ptren.cppreference.com/w/cpp/memory/unique_ptr)。 -
那个解析器生成器坏了。
-
我无法控制由 CodeSynthesis XSD 生成的大部分项目代码。在生成的代码中的某处,它尝试从成员函数返回的引用中分配一个局部变量。我可以选择返回值的类型。唯一的解决方案看起来提供了一个复制构造函数。