对于基本类型,a = a + b
含义a += b
相同。
对于任意类类型,a = a + b
并且a += b
是不相关的;他们查找不同的运算符,这些运算符可以做任意事情。它们实际上不相关是代码异味,这是设计问题的标志。
a = a + b
变得operator=( a, operator+( a, b ) )
粗略;实际的查找规则要复杂一些(涉及成员运算符和非成员运算符,以及没有非成员运算符的事实=
等),但这是它的核心。
a += b
变成operator+=( a, b )
类似的意思。
+
现在,根据+=
;来实现是一种常见的模式。如果你这样做,你会得到:
a = a + b
变成
a = ((auto)(a) += b);
(auto)
新的c++20 / c++23 “创建参数的临时副本”功能在哪里。
从根本上说,a+=b
可以直接重用的内容a
,而a = a + b
不能;目前a+b
正在评估,它不知道a
很快就会被覆盖。
一些库使用一种称为“表达式模板”的技术来处理这个问题;a+b
不是一个值,而是表达式的编译时描述a+b
,当分配给它时,它a
实际上用于填充a
数据。使用表达式模板,消除了a+=b
了解更多信息的基本问题。a=a+b
现在,std::string
具体来说,a+b
创建一个临时字符串对象,然后a=(a+b)
将其移入a
(它可以重用临时字符串对象的缓冲区或 的缓冲区a
,标准对此事保持沉默)。
a+=b
a
必须重用缓冲区中的任何多余容量。所以如果你a.reserve(1<<30)
(10亿),a+=b
不能分配更多。