我可以在构造函数的主体中转发构造吗?

Oli*_*liv 11 c++ constructor language-lawyer

让我们考虑在执行类的构造函数期间S,看起来S可以使用另一个构造函数构造.一种解决方案可能是新建一个位置this以重用存储:

struct S{
    unsigned int j; //no const neither reference non static members
    S(unsigned int i){/*...*/}
    S(int i){
       if (i>=0) {
         new (this) S(static_cast<unsigned int>(i));
         return;}
       /*...*/
       }
    };
 int i=10;
 S x{i};//is it UB?
Run Code Online (Sandbox Code Playgroud)

存储重用在[basic.life]中定义.在构造函数执行期间(重新)使用存储时,我不知道如何阅读本节.

YSC*_*YSC -1

是UB吗?

不它不是。[basic.life]/5说:

程序可以通过重用对象占用的存储空间或通过使用非平凡的析构函数显式调用类类型的对象的析构函数来结束任何对象的生命周期。对于具有非平凡析构函数的类类型的对象,程序不需要在重用或释放该对象占用的存储空间之前显式调用析构函数;但是,如果没有显式调用析构函数,或者没有使用删除表达式来释放存储,则不应隐式调用析构函数,并且任何依赖于析构函数产生的副作用的程序都具有未定义的行为。

强调与你的类相关的部分,其中有一个简单的析构函数。关于具体的形式,我在nornew (this) T;中没有发现这个规则有例外。[class.cdtor][class.dtor]

  • 我的问题是*结束生命周期*,因为根据 [basic.life]/1.2 *类型 T 的对象的生命周期开始于:如果该对象具有非空初始化,则其初始化完成*。所以我们不能结束生命周期,因为它还没有开始。 (5认同)