C++ 在生命周期结束后,重新创建一个新对象,bass类的非静态数据成员的类型是引用类型,这是定义良好的吗?
工作草案N4527 3.8[基本寿命]第7页规定: 如果,在对象的生命周期结束后,在对象占用的存储被重新使用之前,或者 释放后,将在原始对象占用的存储位置创建一个新对象,即 指向原始对象、引用原始对象的引用或原始对象的名称 对象将自动引用新对象,并且在新对象的生存期开始后,可以 用于操纵新对象,如果: (7.1)-新对象的存储正好覆盖原始对象占用的存储位置, 及 (7.2)-新对象与原始对象的类型相同(忽略顶级cv限定符),并且 (7.3)-原始对象的类型不是const限定的,并且,如果是类类型,则不包含任何非静态 类型为常量限定类型或引用类型的数据成员,以及 (7.4)-原始对象是T型最派生对象(1.8),新对象是最派生对象 类型为T的对象(即,它们不是基类子对象) 10[衍生类]p2: 除非在派生类中重新声明,否则成员 基类的成员也被视为派生类的成员 问题1: 当工作草案中显示“非静态数据成员””时,它仅表示派生类的非静态数据成员,或者同时表示派生类和基类的非静态数据成员 问题2: 代码正确吗?来自[class.derived]: 除非在派生类中重新声明,否则成员 基类的成员也被视为派生类的成员C++ 在生命周期结束后,重新创建一个新对象,bass类的非静态数据成员的类型是引用类型,这是定义良好的吗?,c++,C++,工作草案N4527 3.8[基本寿命]第7页规定: 如果,在对象的生命周期结束后,在对象占用的存储被重新使用之前,或者 释放后,将在原始对象占用的存储位置创建一个新对象,即 指向原始对象、引用原始对象的引用或原始对象的名称 对象将自动引用新对象,并且在新对象的生存期开始后,可以 用于操纵新对象,如果: (7.1)-新对象的存储正好覆盖原始对象占用的存储位置, 及 (7.2)-新对象与原始对象的类型相同(忽略顶级cv限定符),并且 (7.3)-原始对象的类型不是const限定的,并且,如果是类类型
a
也是D
的成员,因此D
确实包含引用类型的非静态数据成员。因此,您的使用是无效的 d.~d()代码>哎哟!至于你的第二个问题:没有。
struct B{
B(int &i):a(i){}
int &a;
};
struct D:B{
D(int &i):B(i){}
f();
};
int main()
{
int i = 1;
int j = 2;
D d(i);
d.~D();
new(&d) D(j);
d.f(); //D does not contain any non-static data member
//whose type is a reference type,
//but B does, is this ok?
return 0;
}