显式operator = call和=运算符之间可以有区别吗?

时间:2017-01-30 12:11:23

标签: c++

根据C ++标准,something.operator=(somethingElse)something = somethingElse之间是否存在差异?

第一个出现在T& something的模板中,我想知道用更易读的第二版替换它是否安全。

3 个答案:

答案 0 :(得分:5)

不,没有。显式=运算符会在声明合适operator=()方法的类上调用operator=,就像直接调用operator=方法一样。

所有运营商都是如此,而不只是=。这就是operator类方法的含义的定义:它指定当相应的运算符应用于类的实例时执行的内容。

答案 1 :(得分:4)

除了复制初始化上下文之外,短运算符表达式等同于函数表达式。 C ++标准草案的Table 12描述了运算符表达式:

转载:

Subclause       Expression      As member function         As non-member function

[over.unary]  |     @a    |     (a).operator@ ( )      |    operator@(a)
[over.binary] |     a@b   |     (a).operator@ (b)      |    operator@(a, b)
[over.ass]    |     a=b   |     (a).operator= (b)      |
[over.sub]    |     a[b]  |     (a).operator[](b)      |
[over.ref]    |     a->   |     (a).operator->( )      |
[over.inc]    |     a@    |     (a).operator@ (0)      |    operator@(a, 0)

其中@是运营商的占位符。

原因是,=运算符还有其他上下文使用;在函数声明中,例如默认成员函数,已删除函数和= 0; // pure virtual

答案 2 :(得分:1)

存在细微差别,因为a = b并不总是在对象a上调用显式运算符:

  • T a = b;。它不是一个赋值,而是一个初始化:它调用一个复制(或移动)构造
  • a = b;当a是内部对象(整数,指针,浮点,......)时:=运算符是内置运算符。
  • 如果T可以轻易复制,即使在类上没有声明operator =,也允许分配,因为编译器使用默认的内置分配运算符。

但是如果存在operator =方法并且由重载决策规则选择,则赋值运算符将调用它。