现在是否可以使用当前的C ++标准草稿版本为具有const字段且没有UB的类定义复制分配运算符

问题描述

关于SO,我们对分配给const字段和未定义行为(UB)有很多疑问。例如,This accepted answer表示由于UB,无法为具有const字段的类定义副本分配运算符。

但是我检查了C ++标准(N4861)的当前草案版本。说是UB [basic.life.8]的那部分是:

如果在一个对象的生命周期结束之后并且在重新使用或释放​​该对象所占用的存储之前,在原始对象所占用的存储位置上创建了一个新对象,该对象指向原始对象,引用原始对象的引用或原始对象的名称自动引用新对象,并且一旦开始新对象的生命周期,就可以使用它来操作新对象,如果:...

原始对象的类型不是const限定的,并且,如果是类类型,则不包含任何非静态 类型为const限定或引用类型的数据成员,并且

具有now been replaced和:

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 (将#修改为@)