代码之家  ›  专栏  ›  技术社区  ›  George Cernat

C++-左值需要作为赋值的左操作数[重复]

  •  4
  • George Cernat  · 技术社区  · 7 年前

    #include <iostream>
    using namespace std;
    
    class X 
    {
        int i;
    public:  
        X(int ii = 0);
    };
    
    X::X(int ii) { i = ii; }
    
    int a;
    
    X f1() { return X(); }
    int f2() { return a; }
    
    int main() {
        f1() = X(1);
        f2() = 3;
    } 
    

    如果你试着运行它,你会得到

    错误:左值需要作为赋值的左操作数

    f1()

    被认为是左值,而

    f2()

    2 回复  |  直到 7 年前
        1
  •  5
  •   songyuanyao    7 年前

    f1() 被视为左值

    不,什么 f1 返回值仍然是右值(与相同 f2 ; 更准确地说,这是一个 prvalue f1() = X(1); 仅解释为 f1().operator=(X(1)); f1() 很快就会被摧毁。简而言之,您可以在类类型为的右值上调用成员函数。

    另一方面,直接禁止内置型的类似行为;分配给这样的临时工一点意义都没有。这就是为什么编译器抱怨它不是左值。

        2
  •  2
  •   kocica    7 年前

    f1()

    改变

    int f2() { return a; }
    

    int& f2() {  return a; }
       ^
    

    f1() f1() = X(1); 调用类的赋值运算符 f1().operator=(X(1));

    了解更多信息 value categories here.