我写过这样的代码,将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
stackoverflow中的一些问题说第一种情况应该没有影响,我想知道我的代码中发生了什么。这是std::move
函数中的Obj(1, "lost")
作为参数并在std::move
退出时死亡吗?
1条答案
按热度按时间ohtdti5x1#
std::move
是一个函数调用;它不是C中的一个神奇的运算符,它所做的只是返回一个对给定对象的引用,并通过引用获取其参数。在C中,如果你有一个纯右值,并且你把它传递给一个引用它的函数,那么由这个纯右值创建的临时变量只会持续到表达式结束。
所以
move
返回一个对临时变量的引用,但是这个临时变量在myObj1
初始化后会立即被销毁,所以myObj1
是一个被销毁对象的引用。