C++ 是否允许获取右值的地址?

C++ 是否允许获取右值的地址?,c++,c++11,visual-c++,rvalue,lvalue,C++,C++11,Visual C++,Rvalue,Lvalue,我正在练习描述的东西,学习左值和右值的概念 然而,当我按照下面的方式设计我自己的示例时,我发现它编译和运行时没有任何错误(使用VS2017)。我了解到,在案例1中,这与打电话相同 produceA(10).operator=(A()) 因此是合法的。但是,我仍然不明白为什么案例2和案例3是允许的。事实上,案例2甚至与文章中给出的示例相矛盾。在这两种情况下,我真的得到了右值的地址吗?它们会导致未定义的行为吗 #include <string> class A { int

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

然而,当我按照下面的方式设计我自己的示例时,我发现它编译和运行时没有任何错误(使用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;
}
#包括
甲级
{
int数据=1;
公众:
A()=默认值;
A(整数英寸)
:数据(英寸)
{}
A运算符=(常数A和rhs)
{
数据=rhs.data;
归还*这个;
}
};
产品(国际一)
{
A(i);
返回a;
}
int main()
{
//案例1
produceA(10)=A();
//案例2
A*pa=&produceA(10);//右值?
//案例3
std::string*pstr=&std::string(“Temp”);//右值?
返回0;
}
&produceA(10)
是从函数返回的类型为
A
的匿名临时文件的地址。您可以设置指向它的指针,但该指针仅在整个语句的生存期内有效


这同样适用于
&std::string(“Temp”)
;同样,这是一个匿名临时用户的地址。

但是。。。无法获取临时对象的地址:/
错误:获取“a”类型的临时对象的地址[-Waddress of temporary]
示例代码。你在用什么编译器?我在VS2013和VS2017上都试过了。他们都没有错,非常感谢。我也在你的暗示后发现。使用命令选项/Za会导致情况2和3错误。这个扩展背后的目的对我来说似乎很神秘/