问题描述
关于SO,我们对分配给const字段和未定义行为(UB)有很多疑问。例如,This accepted answer表示由于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();
}
事实上,我的观察是它可以与所有主要的编译器一起使用,但这使其不合法...
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)