这个问题 用户 快乐的米塔尔 引号C ++ 03标准:第12.2.5节: 在构造函数ctor-Inializer(12.6.2)中,临时与参考构件绑定到构造函数退出直到.

无论如何,这怎么有用?我的意思是,一旦构造函数退出,临时性被摧毁,但是引用仍然绑定 - 现在是已经被摧毁的对象。

如果在外部物体的整个生命周期中仍然存在悬空的参考,那么请仔细指定临时寿命的重点是什么?在哪种情况下,此行为可以有用?

有帮助吗?

解决方案

将参考成员绑定到死对象没有用,但是明确地说,当绑定到参考引用时,“正常”临时寿命扩展不适用于这种情况。

它还指定了特别适用于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初始器列表)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top