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

聚合初始化中mem初始值设定项的有效性和/或生存期延长

  •  0
  • ecatmur  · 技术社区  · 5 年前

    asked (稍加编辑):

    struct A {};
    struct B { A&& a = A{}; };
    B b1;         // #1
    B b2{A{}};    // #2
    B b3{};       // #3
    

    #2 是聚合初始化,它绑定 B::a 到初始值设定项中的临时 b2 从而延长了它的寿命 b2级 #3 B: :一个 #2 或者不,就像 #1

    根据关于该问题的说明,在Issaquah(2014-02),CWG打算 #2 ;也就是说,格式良好,并且执行临时的生存期延长 b3.a 绑定。但在下一次ISO会议(Rapperswil,2014-06)上 CWG 1696 adopting 语言 appears to make #3 ill-formed

    但是,该子句下的示例不考虑聚合初始化(如CWG 1815中所述),而只考虑构造函数的初始化;具体来说,定义为defaulted的默认构造函数:

    struct A {
      A() = default;        // OK
      A(int v) : v(v) { }   // OK
      const int& v = 42;    // OK
    };
    A a1;                   // error: ill-formed binding of temporary to reference
    A a2(1);                // OK, unfortunately
    

    在实施实践方面,我们可以 see that 差异很大:

    合同通用条款 MSVC公司
    #1 破坏 拒绝 破坏
    延伸 延伸 延伸
    #3 延伸 破坏

    #3 警告 它不能这样做,这表明开发人员认为在这种情况下,标准要求延长生命周期:

    警告:抱歉,不支持使用默认成员初始值设定项通过聚合初始化创建的临时的生存期扩展;临时的生存期将在完整表达式[-Wdangling]的结尾结束

    问题

    #3

    0 回复  |  直到 5 年前
    推荐文章