我正在练习描述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 :(得分:0)
&produceA(10)
是从函数返回的A
类型的匿名临时的地址。您可以设置指向它的指针,但该指针仅在整个语句的生命周期内有效。
&std::string("Temp")
也可以这样说;再一次,这是一个匿名临时的地址。