是暂时的l值还是不是?

mhk*_*mhk 6 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);
}
Run Code Online (Sandbox Code Playgroud)

fre*_*low 2

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

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