允许获取右值的地址

Taking address of an rvalue allowed?

本文关键字:地址 获取 许获取      更新时间:2023-10-16

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

但是,当我按如下方式编写自己的示例时,我发现它编译和运行没有任何错误(使用 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;
}

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

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