2011-04-19 72 views
12

鉴于以下代码:寿命的临时结合的聚集初始化结构成员

class foo 
{ 
}; 

class bar: public foo 
{ 
public: 
    ~bar() { printf("~bar()\n"); } 
}; 

class zab: public foo 
{ 
public: 
    ~zab() { printf("~zab()\n"); } 
}; 

struct foo_holder 
{ 
    const foo &f; 
}; 

int main() 
{ 
    foo_holder holder[]= { {bar()}, {zab()} }; 
    printf("done!\n"); 
    return 0; 
} 

输出为:

~bar() 
~zab() 
done! 

的C++ 0x具有指示此可以创建悬空引用时的条款用作一个新的初始化程序,但它没有说什么(至少没有我能找到)有关临时引用的const引用的聚合初始化。

那么这是不明确的行为呢?

+0

C++ 11尚不存在。也许你指的是C++ 0x FDIS。 – 2011-04-19 16:35:53

+1

@Tomalak,已更正。我在其他地方看到它,它让我的大脑发痒。 – MSN 2011-04-19 16:36:49

+0

@MSN:够了;) – 2011-04-19 16:43:49

回答

1

我上comp.std.C++答案:

http://groups.google.com/group/comp.std.c++/msg/9e779c0154d2f21b

基本上,标准没有明确解决这个问题;因此,它应该与本地声明的参考一样。

+0

谢谢您的检查。然而,对我而言,它仍然感觉很不一致 - 在POD初始化程序列表中有延长生命期的引用,但不在ctor初始化程序中似乎很奇怪。但是,那是C++。从我+1。 – Vitus 2011-06-06 12:51:23

1

它在例外列表中没有提及,因此应该延长到临时的生存期以匹配(数组)的寿命(数组)foo_holder s。然而,这看起来像对我的监督,也许提交缺陷报告可能是个好主意。


§12.2/ 5状态,即当引用绑定到一个临时的,临时的寿命延长到匹配参考的寿命并且因为const foo& ffoo_holder构件,基准的寿命寿命匹配的foo_holder,根据§3.7.5/ 1:

构件子对象,基类的子对象和数组元素的存储持续时间是它们的完整的对象(1.8)的。

这可能是棘手的解释考虑引用点点,因为§3.8/ 1状态中,存储被释放或再使用时对象的该寿命结束:

类型的对象的生存期T结尾时:

- 如果T是具有一个非平凡的析构函数(12.4)的类类型,析构函数呼叫开始时,或

- 其中对象占据再利用或释放的存储。

但是,未指定引用是否使用存储; §8.3.2/ 4说

没有指定参考是否需要存储(3.7)。

也许有更好的标准知识的人会更清楚地知道这一点。