解决方案
将参考成员绑定到死对象没有用,但是明确地说,当绑定到参考引用时,“正常”临时寿命扩展不适用于这种情况。
它还指定了特别适用于CTOR初始化器的临时寿命扩展:它已扩展到CTOR的末端,而不是在CTOR主体执行之前死亡。除了在“聪明”类中执行CTOR的“聪明”类中,这将是没有用的,并且正确避免了这种类型的(AB)使用。
我知道后者没有现实世界的例子,但这让我感到惊讶,就像默认情况下那样让毁灭者毫无疑问,他们一生中“聪明”的课程以及如何使用它们。这确实有现实世界的用途和 出现 在有关如何处理C ++ 0x中DTOR的默认语义的讨论中。
其他提示
在D语言中,施工过程可以在某种程度上自由编写。但是,在C ++中,严格规定了施工/初始化顺序。因此,如果类初始化需要一些昂贵的计算,那么以下代码有时可能是有效的,可以作为不情愿的解决方法。
struct S {
Args const &r;
A a;
B b;
S( args.... )
: r( expensive_func( args.... ) ), a( r.for_a ), b( r.for_b ) {}
};
这对于编译器作家很有用。他们已经有了逻辑,可以在范围的末端摧毁约束临时性,而构造函数的退出就是其中之一。使用此规则,编译器也可以重复使用该点来摧毁此类临时工。
请注意,该标准确实应该决定一些生命周期,而唯一的合理点是在CTOR初始化器列表之后,但在CTOR主体之前。这不是临时否则会破坏的一点,并且可能会干扰函数范围 try {} catch()
块(确实包括CTOR初始器列表)
不隶属于 StackOverflow