xml*_*lmx 2 c++ rvalue-reference temporary-objects
struct Test
{
Test()
{}
Test(const Test& other)
{
cout << "Copy" << endl;
}
Test(Test&& other)
{
cout << "Move" << endl;
}
};
Test* f()
{
static Test t;
return &t;
}
int main()
{
auto t = *f();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是:复制
*f()显然是一个匿名临时对象,因此它应该是一个r值,并且应该调用move-constructor.为什么编译器将其*f()视为l值?
这是编译器的错误,还是我的理解错了?
为什么编译器将*f()视为l值?
因为它是一个l值.当应用于指针时,operator*的结果始终是l值.并且你不能隐含地从l值移动.
记住运动的黄金法则:运动只有在保证安全的情况下才会发生(对于"保证"的某种定义).
看看你的代码.您想要移动的物体是否会被摧毁并且移动后无法进入?如果没有,那么你必须使用std::move它来移动它; 这告诉系统你要对因运动而发生的任何搞砸负责.