函数返回的临时对象不总是r值吗?

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值?

这是编译器的错误,还是我的理解错了?

R. *_*des 14

结果f()是类型的匿名临时对象Test*.f()是一个左值.

*f()通过所述指针执行间接.与使用间接运算符时的情况一样,结果是左值.


Nic*_*las 8

为什么编译器将*f()视为l值?

因为它一个l值.当应用于指针时,operator*的结果始终是l值.并且你不能隐含地从l值移动.

记住运动的黄金法则:运动只有在保证安全的情况下才会发生(对于"保证"的某种定义).

看看你的代码.您想要移动的物体是否会被摧毁并且移动后无法进入?如果没有,那么你必须使用std::move它来移动它; 这告诉系统你要对因运动而发生的任何搞砸负责.