搜尋

首頁  >  問答  >  主體

c++ - 关于左右值的疑问?

考虑如下代码

class Foo
{
public:
    int x, y;
};
Foo operator*(const Foo &lhs, const Foo &rhs)
{
    Foo ret;
    return ret;
}

int main()
{
    Foo a, b, c;
    (a * b) = c;
    return 0;
}

operator*(a, b)返回的应该是一个右值,为什么可以被赋值呢??编译器没有提示错误。

PHP中文网PHP中文网2772 天前423

全部回覆(2)我來回復

  • PHP中文网

    PHP中文网2017-04-17 15:18:02

    你的Code是有問題的,在我這兒.

    $ g++ main.cpp --std=c++11
    main.cpp:10:49: error: ‘Foo Foo::operator*(const Foo&, const Foo&)’ must take either zero or one argument
         Foo operator*(const Foo &lhs, const Foo &rhs)
                                                     ^
    main.cpp: In function ‘int main()’:
    main.cpp:20:8: error: no match for ‘operator*’ (operand types are ‘Foo’ and ‘Foo’)
         (a * b) = c;
    

    你的程式碼是範例程式碼吧? 你的重載運算子是錯誤的.格式都寫錯了吧? 重載不應該是如下嗎?

    函数类型 X::operator 运算符(形参表)
    {
    函数体
    }
    
    Foo operator*(const Foo &arg1, const Foo &arg2)
    这里面的并不代表左右值.

    不太懂您的意思.

    我記得右邊值也可以是被賦值的.如果函數回傳的右邊值是一個引用呢?

    就像下面這段程式碼

    // array::front
    #include <iostream>
    #include <array>
    
    int main ()
    {
      std::array<int,3> myarray = {2, 16, 77};
    
      std::cout << "front is: " << myarray.front() << std::endl;   // 2
      std::cout << "back is: " << myarray.back() << std::endl;     // 77
    
      myarray.front() = 100; ///???? 
    
      std::cout << "myarray now contains:";
      for ( int& x : myarray ) std::cout << ' ' << x;
    
      std::cout << '\n';
    
      return 0;
    }

    回覆
    0
  • 怪我咯

    怪我咯2017-04-17 15:18:02

    不能把「左值」、「右值」簡單理解為出現在等號兩邊的位置。尤其是當一個類別物件出現在等號左邊時,物件賦值實際上是透過呼叫函數operator=完成的:

    (a * b) = c ==> (a*b).operator=(c)

    回覆
    0
  • 取消回覆