std::move 是否调用纯右值解构对象?
Does std::move called on a prvalue deconstruct the object?
我编写了这样的代码,将 std::move
应用于临时构造函数的纯右值。
// a std::string instance in class Obj
Obj&& myObj1 = std::move(Obj(1,"lost"));
print(myObj1);
Obj&& myObj2 = Obj(2,"keep");
print(myObj2);
打印效果是这样的(print
也在构造函数和析构函数中):
Construct lost
Destroy lost
obj1:
Construct keep
obj2: keep
Destroy keep
Whosebug 中的一些问题说第一种情况应该没有效果,我想知道我的代码中发生了什么。是 std::move
函数中的 Obj(1, "lost")
作为参数并在 std::move
退出时死亡吗?
std::move
是函数调用;它不是 C++ 的神奇运算符。它所做的只是 return 对给定对象的引用。并通过引用获取其参数。
在 C++ 中,如果您有一个纯右值,并将其传递给一个引用它的函数,则由该纯右值创建的临时值只会持续到表达式结束。
因此 move
return 是对临时文件的引用。但是在 myObj1
初始化后,该临时文件将立即被销毁。所以 myObj1
是对已销毁对象的引用。
我编写了这样的代码,将 std::move
应用于临时构造函数的纯右值。
// a std::string instance in class Obj
Obj&& myObj1 = std::move(Obj(1,"lost"));
print(myObj1);
Obj&& myObj2 = Obj(2,"keep");
print(myObj2);
打印效果是这样的(print
也在构造函数和析构函数中):
Construct lost
Destroy lost
obj1:
Construct keep
obj2: keep
Destroy keep
Whosebug 中的一些问题说第一种情况应该没有效果,我想知道我的代码中发生了什么。是 std::move
函数中的 Obj(1, "lost")
作为参数并在 std::move
退出时死亡吗?
std::move
是函数调用;它不是 C++ 的神奇运算符。它所做的只是 return 对给定对象的引用。并通过引用获取其参数。
在 C++ 中,如果您有一个纯右值,并将其传递给一个引用它的函数,则由该纯右值创建的临时值只会持续到表达式结束。
因此 move
return 是对临时文件的引用。但是在 myObj1
初始化后,该临时文件将立即被销毁。所以 myObj1
是对已销毁对象的引用。