从成员函数返回仅移动对象
Return a move-only object from member function
我在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'
更新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::只需将开关类型从Variable移动到Variable&;,允许调用具有移动语义的构造函数
所以:
第一个std::move允许为返回创建临时对象
第二个std::模式允许创建变量v
相关文章:
- 当 std::move 与 C 样式数组或不移动对象时会发生什么
- 如果这不是类的"复制构造函数",是否可以移动对象?
- 我可以从向量的开头移动对象吗?为什么不呢
- 为什么可以使用已删除的移动构造函数和赋值运算符移动对象?
- 使用参数将仅可移动对象捕获到 lambda
- 初始化不可移动对象数组:为什么这样的代码无法在 GCC 上编译?
- c++ 从成员函数创建新线程并移动对象和整个对象
- 返回unique_ptr或只是移动对象
- 将 OpenGL 实例化图形与移动对象一起使用
- 如何在给定两个点的线上移动对象?
- 使用文件描述符移动对象
- 为什么移动对象不会使其为空?
- 被引用的移动对象
- Maya c++ API,移动对象?
- 为什么传递std ::移动(对象)和此对象的成员函数会导致sigsegv
- 命令模式:如何进行连续操作?(例如,移动对象)
- 返回具有显式构造函数的不可复制的不可移动对象
- 如何在 C++ 中的特定边界内移动对象
- 在阵列中向上移动对象
- DirectX 11 基于旋转移动对象