【问题标题】:C++ - On friend assignment-operator overloadsC++ - 关于友元赋值运算符重载
【发布时间】:2020-07-01 05:11:15
【问题描述】:

我一直在尝试使用 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 编译器)?

【问题讨论】:

  • 我可以理解为什么第一个重载不应该工作,能够重载像int 这样的 POD 类型的运算符似乎并不干净。但是第二个重载,为什么编译器会接受这个(它可能是标准的AFAIK,也可能不是标准的AFAIK)?

标签: c++ operator-overloading assignment-operator


【解决方案1】:

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

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

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

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

【讨论】:

  • 这里的要点是=()[] 运算符必须是类的非静态成员(与其他运算符不同)。
猜你喜欢
  • 2012-05-26
  • 1970-01-01
  • 1970-01-01
  • 2013-03-30
  • 2016-08-30
  • 1970-01-01
  • 1970-01-01
  • 2014-10-16
  • 2018-12-27
相关资源
最近更新 更多