相关疑难解决方法(0)

聚合初始化中 mem-initializer 的有效性和/或生命周期延长

CWG 1815询问(稍作修改):

struct A {};
struct B { A&& a = A{}; };
B b1;         // #1
B b2{A{}};    // #2
B b3{};       // #3
Run Code Online (Sandbox Code Playgroud)

[...]#2是聚合初始化,它绑定B::a到初始化器中的临时对象 for b2,从而将其生命周期延长到b2. #3是聚合初始化,但不清楚非静态数据成员初始值设定项中的临时生命周期是否B::a应该像 一样延长生命周期#2,例如#1

根据关于该问题的说明,在 Issaquah (2014-02) CWG 打算使#3行为像#2;也就是说,格式良好,并执行b3.a绑定的临时对象的生命周期扩展。但在接下来的ISO会议(拉珀斯韦尔,2014-06),分辨率为CWG 1696获得通过,表面上是解决CWG 1815,但采用的语言,似乎使#3病态的

11 - 绑定到来自默认成员初始值设定项的引用成员的临时表达式格式错误。

但是,紧接在该条款下的示例不考虑聚合初始化(如 CWG 1815),而仅考虑构造函数的初始化;具体来说,默认构造函数定义为 defaulted:

struct A {
  A() = default; …
Run Code Online (Sandbox Code Playgroud)

c++ lifetime language-lawyer temporary-objects c++14

6
推荐指数
0
解决办法
68
查看次数