我正在练习描述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;
}
您的示例代码[不编译](http://coliru.stacked-crooked.com/a/a5adcbe34052d925)。你使用什么编译器? – Quentin
我在VS2013和VS2017上都试过这个。他们都没有错误。 –
非常感谢。在提示之后,我也发现[this one](https://stackoverflow.com/questions/16380966/non-const-reference-bound-to-temporary-visual-studio-bug)。使用命令选项/ Za会导致第2个和第3个错误。这个扩展背后的目的对我来说似乎很神秘。 :/ –