6

为什么 main 中的第一行可以编译,而第二行没有?我认为两者都是临时的,但一个被视为 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);
}
4

3 回答 3

2

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

请注意,在 C++ 中,术语左值与赋值的左侧无关。正如您的示例所示,分配给类类型的右值是非常好的。此外,有些左值是您无法分配的,例如数组和/或常量,尤其是字符串文字。

于 2013-03-31T18:13:37.790 回答
0

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

于 2013-03-31T18:01:09.447 回答
0

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

Achar()没有这些。因此,禁止分配此类表达式。从语言的角度来看,这项作业修改了什么还不清楚。以后会 2相等0吗?

于 2013-03-31T18:25:50.373 回答