【发布时间】:2020-09-18 04:50:00
【问题描述】:
operator+= 的 canonical implementation 将 RHS 作为 const 引用传递:
X& operator+=(const X& rhs)
然而,在
x += x;
RHS 已修改。这会调用 UB 吗?
【问题讨论】:
-
为什么你认为这里有UB?
x是可修改的。rhs没有,但没有被修改。 -
rhs是怎么修改的?按照你的思路,int a = 5; int const& ar = a; a = 6;算不算修改ar? -
骗子似乎不是正确的:X += X 是 UB,因为关于副作用和不确定顺序的规则。 rhs 是只读的或不可变的这一事实在这里不起作用
-
@Christophe - 该规则仅适用于内置运算符。重载运算符是函数调用
-
const 引用并不意味着它所引用的对象是 const 或不能更改。
标签: c++ operator-overloading language-lawyer const-correctness