在C ++标准中临时绑定到成员生命周期语句的重点是什么?

时间:2011-01-18 08:20:29

标签: c++ object-lifetime

this question用户Happy Mittal引用C ++ 03标准的第12.2.5节: 临时绑定到构造函数的ctor-initializer中的引用成员(12.6.2) )一直持续到构造函数退出

这怎么可能有用呢?我的意思是一旦构造函数退出临时被破坏,但引用仍然绑定 - 现在已经被破坏的对象。

如果外部对象的整个生命周期中仍然存在悬空引用,那么仔细指定临时生命周期的重点是什么?在哪种情况下这种行为有用吗?

3 个答案:

答案 0 :(得分:8)

将引用成员绑定到死对象是没有用的,但是明确指出绑定到引用时的“正常”临时生命周期扩展在这种情况下不适用是有用的。

它还指定了特别适用于ctor初始化程序的临时生命周期扩展:它扩展到ctor的末尾,而不是在ctor主体执行之前死亡。除了“巧妙”的类,其全部要点正在执行ctor之外,这是没有用的,并且正确地避免使用这种类型的(ab)。

我知道后者没有现实世界的例子,但它让我感觉类似于让析构函数默认情况下打破了一生中“聪明”的类以及如何使用它们。在讨论如何处理C ++ 0x中dtors的默认语义时,这确实有真实的用途和came up

答案 1 :(得分:2)

在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 ) {}
};

答案 2 :(得分:1)

它对编译器编写者很有用。他们已经有了逻辑来破坏作用域末尾的绑定临时对象,构造函数的退出就是这样一个点。有了这个规则,编译器就可以重用这一点来摧毁这些临时工。

请注意,标准确实应该决定一些生命周期,唯一的另一个合理点是在ctor初始化列表之后但在ctor体之前。这不是临时销毁的点,否则会干扰函数范围try {} catch()块(包括ctor初始化列表)