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