【问题标题】:Is it not possible for an overloaded operator= returning void be a copy assignmnent operator?重载的 operator= 返回 void 不可能是复制分配运算符吗?
【发布时间】:2015-04-20 13:40:25
【问题描述】:

参考http://en.cppreference.com/w/cpp/language/as_operator 的页面,复制赋值运算符(在需要时由编译器自动生成)返回其自身类型的左值引用。

所以当我如下定义一个重载运算符时,

void operator=(T& t)

编译器是否还有可能隐式定义默认的复制赋值运算符?

【问题讨论】:

  • 返回类型不被视为函数签名的一部分,所以我不希望
  • 为什么要让退货无效?如果你这样做,你就不能做foo a = b = c = d = some_val;之类的事情
  • @NathanOliver:那会是一件坏事吗?
  • 您是否正在尝试解决某个特定问题?这个问题看起来像是一个可能的 X/Y 问题。
  • @BenjaminLindley 好吧,如果他想禁止它,那就不行。我倾向于支持这样的论点,即如果您提供一个运算符,它的行为应该类似于内置类型的运算符。

标签: c++ operator-overloading


【解决方案1】:

这是 C++11 [class.copy]/17 中语言标准指定的复制赋值运算符:

用户声明的复制赋值运算符X::operator= 是类X 的非静态非模板成员函数,只有一个XX&const X&volatile X& 类型的参数或const volatile X&.

返回类型不影响它是否被认为是复制赋值运算符。它只会影响您可以对赋值表达式的结果执行的操作。

【讨论】:

  • 所以,没有(标题)和是(正文)。
【解决方案2】:

C++ Reference(正如你自己发现的那样)声明:

如果没有为类类型(结构、类或联合)提供用户定义的复制赋值运算符,编译器将始终将其声明为该类的内联公共成员。

类 T 的复制赋值运算符是一个名为 operator= 的非模板非静态成员函数,它只接受一个类型为 T、T&、const T&、volatile T& 或 const volatile T& 的参数

也就是说:一旦你声明了你自己的复制赋值运算符(它接受一个 T& 参数),编译器就不会添加一个隐式的。

但是为什么要返回 void 仍然是个问题……(C​​++ 编码指南建议返回对 self 的引用)

【讨论】:

  • 所以这取决于用户定义的void operator=(T& t) 是否有资格作为复制赋值运算符或非复制赋值运算符,但您不回答它是哪一个。 (您的链接也确实回答了这个问题,因此您可以在答案中包含更多内容。)
  • @hvd 相应地更新了答案...感谢您指出这一点。
  • 我不明白您如何从这两个引文中得出结论(尽管我并不是说结论是错误的)。特别是第一个,没有说明什么会导致编译器生成隐式赋值运算符。它只提供一个条件来保证它生成一个。也没有说是否还有其他条件也可以满足。
  • @BenjaminLindley 规范规定,如果条件匹配,编译器会声明一个隐式运算符。这意味着编译器必须检查条件是否匹配,然后才声明一个隐式运算符。
  • @Daniel 它声明“如果”,而不是“当且仅当”。 “如果”我赢了一百万美元,明天太阳仍然会升起。但是如果你明天看到太阳升起,你就不能断定我赢了一百万美元。 :) 所以本杰明林德利在技术上是对的,它没有回答它。没有任何其他描述何时生成复制赋值运算符,暗示了“仅当”,但很难在您的答案中引用缺乏这样的描述。
猜你喜欢
  • 2017-01-23
  • 1970-01-01
  • 2012-11-06
  • 1970-01-01
  • 1970-01-01
  • 2017-07-09
  • 1970-01-01
  • 2021-10-22
  • 1970-01-01
相关资源
最近更新 更多