是否是一个临时的l值

is a temporary l-value or not?

本文关键字:一个 是否是      更新时间:2023-10-16

为什么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);
}

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

请注意,在c++中,术语左值与赋值的左边没有任何关系。正如您的示例所演示的,给类类型的右值赋值是完全可以的。此外,有些左值不能赋值,例如数组和/或常量,尤其是字符串字面值。

如果你没有创建赋值操作符,编译器会为你创建一个。这意味着您创建了两个临时对象,并将一个分配给另一个,然后它们都将被丢弃。

不,第二个不是临时的。临时对象是具有(通常是有限的)生命周期的东西,并且在其生命周期内有一个存储区域。

A char()没有这些。因此,禁止赋值这样的表达式。从语言的角度来看,不清楚赋值改变了什么。之后2是否等于0 ?

相关文章: