2017-10-10 83 views
3

我正在练习描述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; 
} 
+0

您的示例代码[不编译](http://coliru.stacked-crooked.com/a/a5adcbe34052d925)。你使用什么编译器? – Quentin

+0

我在VS2013和VS2017上都试过这个。他们都没有错误。 –

+0

非常感谢。在提示之后,我也发现[this one](https://stackoverflow.com/questions/16380966/non-const-reference-bound-to-temporary-visual-studio-bug)。使用命令选项/ Za会导致第2个和第3个错误。这个扩展背后的目的对我来说似乎很神秘。 :/ –

回答

0

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

对于&std::string("Temp")也是如此;再次,这是一个匿名临时地址。

+0

但是......你不能接受临时地址:/'错误:取一个类型为'A'的临时对象的地址[-Waddress-of-temporary] – Quentin

相关问题