C++ 现在是否可以使用当前的C++;标准草稿版本,用于为具有常量字段且不带UB的类定义复制赋值运算符
在这里,我们有很多关于常量字段赋值和未定义行为(UB)的问题。例如,由于UB,无法为具有常量字段的类定义复制赋值运算符 <>但是我检查了C++标准的当前草稿版本(N48 61)。说会是UB的部分是: 如果在对象的生命周期结束后,在重用或释放对象占用的存储之前,在原始对象占用的存储位置创建了一个新对象,一个指向原始对象的指针,一个引用原始对象的引用,或者,原始对象的名称将自动引用新对象,并且在新对象的生存期开始后,可以用于操纵新对象,如果: 原始对象的类型不是const限定的,如果是类类型,则不包含任何非静态类型 类型为常量限定类型或引用类型的数据成员,以及 已与: o1不是一个完整的常量对象,并且 我的解释是,下面的代码现在没有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限定的,如果是类类型,则不包含任
#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。这对我来说没有任何意义。你的意思是什么?在你在现实世界中使用它之前,想想如果你从这个东西派生赋值运算符会做什么。