是暂时的l值还是不是?

时间:2013-03-31 17:46:19

标签: c++

为什么主要编译的第一行却没有第二行? 我认为两者都是临时性的,但其中一个被视为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);
}

3 个答案:

答案 0 :(得分:2)

在类类型上,赋值运算符是成员函数。也就是说,a = b只是a.operator=(b)的合成糖。在临时工中调用成员函数是完全可以的。

请注意,在C ++中,术语 lvalue 与作业的左侧无关。正如您的示例所示,分配给类类型的rvalues是完全正确的。此外,还有无法分配的左值,例如数组和/或常量,尤其是字符串文字。

答案 1 :(得分:0)

如果您不创建赋值运算符,编译器将为您创建一个赋值运算符。这意味着您创建两个临时对象,并将一个临时指定给另一个,然后它们都被丢弃。

答案 2 :(得分:0)

不,第二个不是暂时的。临时是一种具有(大部分是有限的)生命周期的东西,并且在其生命期内具有存储区域。

char()没有这些。因此,禁止分配这样的表达。从语言的角度来看,分配修改的内容尚不清楚。之后会2等于0吗?