Ber*_*nns 5 c++ undefined-behavior language-lawyer c++20
在这里,我们有很多关于 const 字段赋值和未定义行为 (UB) 的问题。例如,这个接受的答案说,由于 UB 的原因,不可能为具有 const 字段的类定义复制赋值运算符。
但我检查了 C++ 标准的当前草案版本(N4861)。表示将是 UB [basic.life.8]的部分是:
如果一个对象的生命周期结束后,在该对象占用的存储空间被重用或释放之前,在原对象占用的存储位置上创建一个新的对象,一个指向原对象的指针,一个指向该对象的引用引用原始对象,或者原始对象的名称将自动引用新对象,并且一旦新对象的生命周期开始,可用于操作新对象,如果:...
原始对象的类型不是 const 限定的,并且如果是类类型,则不包含任何类型为 const 限定的非静态数据成员或引用类型,并且
现已替换为:
o1 不是一个完整的 const 对象,并且
我的解释是,下面的代码现在没有 UB。这样对吗?我问这个是因为在样本中,没有简历合格的成员 - 所以我仍然不清楚。
#include <iostream>
struct C {
const int i;
void f() const {
std::cout << i << "\n";
}
C(int i) : i(i) {}
C& operator=( const C& );
};
C& C::operator=( const C& other) {
if ( this != &other ) {
this->~C(); // lifetime of *this ends
new (this) C(other); // new object of type C created
f(); // well-defined
}
return *this;
}
int main(){
C c1(1);
C c2(2);
c1 = c2; // well-defined
c1.f();
}
Run Code Online (Sandbox Code Playgroud)
事实上,我的观察是它适用于所有主要编译器,但这使得它不合法......