【发布时间】:2018-03-07 07:35:58
【问题描述】:
我偶然发现了一些非常古老的代码,它有一个定义了复制赋值运算符的类,该运算符将其参数作为 const 引用,但也不检查自赋值,所以本质上是:
struct A
{
int q;
A(): q(3) {}
A& operator=(const A& a)
{
q = a.q;
return *this;
}
};
当A 的实例被分配给它自己时,这个赋值运算符的行为是什么?我认为这会导致问题,因为它“破坏”了参数的常量性,任何编译器都可以假设参数没有更改并基于此进行优化。
但是,clang 和 gcc 都没有发出警告,程序运行良好。如果我在赋值运算符中的赋值之前将 q 的值显式更改为 4,这也有效。
【问题讨论】:
-
值得注意的是,确实,在这种情况下,参数没有改变。