C++ 具有包装的const和ref成员的类能否安全地重用其存储?

C++ 具有包装的const和ref成员的类能否安全地重用其存储?,c++,constants,undefined-behavior,c++17,C++,Constants,Undefined Behavior,C++17,如标准中所述: 3.8.8如果在一个对象的生命周期结束后,在该对象占用的存储被重新使用或释放之前,在原始对象占用的存储位置创建一个新对象,一个指向原始对象的指针,一个引用原始对象的引用,或者,原始对象的名称将自动引用新对象,并且,一旦新对象的生存期开始,可以 用于操纵新对象,如果: (8.3)并且,如果类类型不包含任何类型为const-qualified或引用类型的非静态数据成员 “数据成员”仅指类别的直接成员,而非其成员: 9.2.3数据成员是由成员声明器引入的非功能成员 因此,如果我们对常

如标准中所述:

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

(8.3)并且,如果类类型不包含任何类型为const-qualified或引用类型的非静态数据成员

“数据成员”仅指类别的直接成员,而非其成员:

9.2.3数据成员是由成员声明器引入的非功能成员

因此,如果我们对常量成员使用棘手的包装器:

template<class T>
class const_wrapper
{
    struct Inner { const T value; };
    // non-const member, so const_wrapper is accessible through its name or pointer to it?
    Inner wrapped_value;

    public:
    const_wrapper(const T& v) : wrapped_value({v}) {}
    const_wrapper(T&&) : wrapped_value({std::move(v)}) {}

    operator const T& () {
            // accessed through launder -> Ok?
            return std::launder(&wrapped_value)->value; 
    }

};
哪些存储可以在UB没有问题的情况下重用,并且需要显式使用std::launder

S s{4};
S * ps = &s;
s.~S();
s.S{5}
cout << ps->i << ps->foo(3); // no UB, prints "58" ?
S{4};
S*ps=&S;
s、 ~s();
s、 s{5}
我不能(3);//没有UB,打印“58”?
或者还有其他一些我没有提到的问题

S s{4};
S * ps = &s;
s.~S();
s.S{5}
cout << ps->i << ps->foo(3); // no UB, prints "58" ?