根据C ++标准,something.operator=(somethingElse)
和something = somethingElse
之间是否存在差异?
第一个出现在T& something
的模板中,我想知道用更易读的第二版替换它是否安全。
答案 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 =
方法并且由重载决策规则选择,则赋值运算符将调用它。