C++ - 关于友元赋值运算符重载

C++ - On friend assignment-operator overloads

我一直在尝试使用 C++ 创建代码接口 类。

测试中出现的一个令人费解的事情是重载赋值运算符。 看看下面的代码:

struct my_object {
  // This doesn't work. :(
  friend int& operator =(int& variable, my_object object)
  { variable = object.value; return variable; }

  // This works, but `int value; value <<= my_object{};` 
  // for `int value; value = my_object{};` doesn't seem clean...
  friend int& operator <<=(int& variable, my_object object)
  { variable = object.value; return variable; }
};

我的困惑是:
第一次重载不编译并将此错误记录到控制台终端。

'friend int& operator =(int&, my_object)' must be a nonstatic member function

但是,尽管与第一个几乎相同,但第二个重载编译时没有任何错误(或警告)。


为什么第一个运算符重载无效而第二个似乎没问题(至少对于 GCC 6.3.0 编译器而言)?

=()(函数调用)和 [] 运算符必须是 class 的成员。其他运营商一般可以是会员也可以是非会员。

因此,唯一可以重载赋值运算符的情况是在左侧定义 class 时。无法编写左侧参数为非 class 类型的自定义赋值运算符。

为了将my_object赋值给int,您需要编写一个转换函数:

struct my_object {
    operator int() const { return value; }
    // ...
    int value;
};