C++ 在生命周期结束后,重新创建一个新对象,bass类的非静态数据成员的类型是引用类型,这是定义良好的吗?

C++ 在生命周期结束后,重新创建一个新对象,bass类的非静态数据成员的类型是引用类型,这是定义良好的吗?,c++,C++,工作草案N4527 3.8[基本寿命]第7页规定: 如果,在对象的生命周期结束后,在对象占用的存储被重新使用之前,或者 释放后,将在原始对象占用的存储位置创建一个新对象,即 指向原始对象、引用原始对象的引用或原始对象的名称 对象将自动引用新对象,并且在新对象的生存期开始后,可以 用于操纵新对象,如果: (7.1)-新对象的存储正好覆盖原始对象占用的存储位置, 及 (7.2)-新对象与原始对象的类型相同(忽略顶级cv限定符),并且 (7.3)-原始对象的类型不是const限定的,并且,如果是类类型

工作草案N4527 3.8[基本寿命]第7页规定:

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

(7.1)-新对象的存储正好覆盖原始对象占用的存储位置, 及

(7.2)-新对象与原始对象的类型相同(忽略顶级cv限定符),并且

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

(7.4)-原始对象是T型最派生对象(1.8),新对象是最派生对象 类型为T的对象(即,它们不是基类子对象)

10[衍生类]p2:

除非在派生类中重新声明,否则成员 基类的成员也被视为派生类的成员

问题1:

当工作草案中显示“非静态数据成员””时,它仅表示派生类的非静态数据成员,或者同时表示派生类和基类的非静态数据成员

问题2:

代码正确吗?

来自[class.derived]:

除非在派生类中重新声明,否则成员 基类的成员也被视为派生类的成员

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;
}