我偶然发现了一些非常老的代码,其中一个类定义了复制赋值运算符,它将参数作为const引用,但也没有检查自我赋值,因此本质上是:
struct A
{
int q;
A(): q(3) {}
A& operator=(const A& a)
{
q = a.q;
return *this;
}
};
当将一个
A
实例分配给自身时,此赋值运算符的行为是什么?我认为这会导致问题,因为它“破坏”了参数的常量性,任何编译器都可以假设参数没有被改变并基于此进行优化。
然而,无论是clang还是gcc都没有发出警告,程序也可以正常运行。如果在赋值运算符中的赋值之前明确更改q
的值为4,则此方法也有效。