为什么主要编译的第一行却没有第二行? 我认为两者都是临时性的,但其中一个被视为l值而另一个则不是......
class complex
{
public:
complex() : r(0),i(0) {}
complex(double r_, double i_) : r(r_), i(i_)
{
}
private:
double r;
double i;
};
int main()
{
complex(2,2) = complex(1,2);
char() = char(2);
}
答案 0 :(得分:2)
在类类型上,赋值运算符是成员函数。也就是说,a = b
只是a.operator=(b)
的合成糖。在临时工中调用成员函数是完全可以的。
请注意,在C ++中,术语 lvalue 与作业的左侧无关。正如您的示例所示,分配给类类型的rvalues是完全正确的。此外,还有无法分配的左值,例如数组和/或常量,尤其是字符串文字。
答案 1 :(得分:0)
如果您不创建赋值运算符,编译器将为您创建一个赋值运算符。这意味着您创建两个临时对象,并将一个临时指定给另一个,然后它们都被丢弃。
答案 2 :(得分:0)
不,第二个不是暂时的。临时是一种具有(大部分是有限的)生命周期的东西,并且在其生命期内具有存储区域。
char()
没有这些。因此,禁止分配这样的表达。从语言的角度来看,分配修改的内容尚不清楚。之后会2
等于0
吗?