考虑允许rvalue的地址?

时间:2017-10-10 07:40:11

标签: c++ c++11 visual-c++ rvalue lvalue

我正在练习描述Here的东西来学习左值和右值的概念。

但是,当我按照以下方式设计自己的示例时,我发现它编译并运行时没有任何错误(使用VS2017)。我了解到,在案例1中,它与调用

相同
produceA(10).operator=(A()) 

因此是合法的。但是,我仍然不明白为什么案例2和3是允许的。事实上,案例2甚至与文章中给出的例子相矛盾。在这两种情况下,我真的得到了右值的地址吗?它们会导致不明确的行为吗?

#include <string>

class A
{
    int data = 1;
public:
    A() = default;

    A(int in)
    : data(in)
    {}

    A& operator=(const A& rhs)
    {
        data = rhs.data;
        return *this;
    }
};

A produceA(int i)
{
    A a(i);
    return a;
}


int main()
{
    // case 1
    produceA(10) = A();

    // case 2
    A* pa = &produceA(10);    // rvalue?

    // case 3
    std::string* pstr = &std::string("Temp");    // rvalue?

    return 0;
}

1 个答案:

答案 0 :(得分:0)

&produceA(10)是从函数返回的A类型的匿名临时的地址。您可以设置指向它的指针,但该指针仅在整个语句的生命周期内有效。

&std::string("Temp")也可以这样说;再一次,这是一个匿名临时的地址。