Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 现在是否可以使用当前的C++;标准草稿版本,用于为具有常量字段且不带UB的类定义复制赋值运算符_C++_Language Lawyer_Undefined Behavior_C++20 - Fatal编程技术网

C++ 现在是否可以使用当前的C++;标准草稿版本,用于为具有常量字段且不带UB的类定义复制赋值运算符

C++ 现在是否可以使用当前的C++;标准草稿版本,用于为具有常量字段且不带UB的类定义复制赋值运算符,c++,language-lawyer,undefined-behavior,c++20,C++,Language Lawyer,Undefined Behavior,C++20,在这里,我们有很多关于常量字段赋值和未定义行为(UB)的问题。例如,由于UB,无法为具有常量字段的类定义复制赋值运算符 但是我检查了C++标准的当前草稿版本(N48 61)。说会是UB的部分是: 如果在对象的生命周期结束后,在重用或释放对象占用的存储之前,在原始对象占用的存储位置创建了一个新对象,一个指向原始对象的指针,一个引用原始对象的引用,或者,原始对象的名称将自动引用新对象,并且在新对象的生存期开始后,可以用于操纵新对象,如果: 原始对象的类型不是const限定的,如果是类类型,则不包含任

在这里,我们有很多关于常量字段赋值和未定义行为(UB)的问题。例如,由于UB,无法为具有常量字段的类定义复制赋值运算符

<>但是我检查了C++标准的当前草稿版本(N48 61)。说会是UB的部分是:

如果在对象的生命周期结束后,在重用或释放对象占用的存储之前,在原始对象占用的存储位置创建了一个新对象,一个指向原始对象的指针,一个引用原始对象的引用,或者,原始对象的名称将自动引用新对象,并且在新对象的生存期开始后,可以用于操纵新对象,如果:

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

已与:

o1不是一个完整的常量对象,并且

我的解释是,下面的代码现在没有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();
}
#包括
结构C{
常数int i;
void f()常量{

std::难道你的引用在上下文之外毫无意义。你应该引用或总结basic.life。8正如你的引用所定义的那样。我在这里添加了对一个类似但古老的问题的引用,因此…如果你愿意,你可以根据当前的措辞更改或扩展引用,如果C恰好是数组或mem的元素,你就有UB一个类的ber。这对我来说没有任何意义。你的意思是什么?在你在现实世界中使用它之前,想想如果你从这个东西派生赋值运算符会做什么。