代码之家  ›  专栏  ›  技术社区  ›  Oliv

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

  •  11
  • Oliv  · 技术社区  · 6 年前

    让我们考虑在类的构造函数执行期间 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?
    

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

    2 回复  |  直到 6 年前
        1
  •  3
  •   Rakete1111    6 年前

    在这种情况下,标准是完全不明确的,我找不到相关的CWG问题。

    就其本身而言,你的新位置不是UB。毕竟,存储没有对象,所以可以直接在其中构造对象。正如你所说的,第一个物体的生命周期还没有开始。

    你甚至可以构造更奇怪的代码:

    struct X {
      X *object;
      int var;
      X() : object(new (this) X(4)), var(5) {} // ?!?
      X(int x) : var(x) {}
    } x;
    
        2
  •  -1
  •   Rakete1111    6 年前

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

    程序可以通过重用对象所占用的存储器来结束任何对象的生命周期

    强调与类相关的部分,它有一个简单的析构函数。关于具体的 new (this) T; [class.cdtor] 也没有 [class.dtor] .