给出以下代码:
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 引用的聚合初始化)。
那么这是未指定的行为吗?
例外列表中未提及,因此临时的生命周期应延长以匹配(数组)的生命周期foo_holder
s。然而,这对我来说似乎是疏忽,也许提交缺陷报告可能是个好主意。
§12.2/5 规定,当引用绑定到临时对象时,临时对象的生命周期将延长以匹配引用的生命周期,并且因为const foo& f
是的成员foo_holder
,引用的生命周期与foo_holder
,根据§3.7.5/1:
成员子对象、基类子对象和数组元素的存储期限是其完整对象的存储期限(1.8)。
考虑到引用,解释起来可能有点棘手,因为第 3.8/1 节指出,当存储被释放或重用时,对象的生命周期结束:
T 类型对象的生命周期在以下情况结束:
— 如果 T 是具有非平凡析构函数的类类型 (12.4),则析构函数调用开始,或者
— 对象占用的存储被重用或释放。
但是,未指定引用是否使用存储; §8.3.2/4 说
未指定引用是否需要存储(3.7)。
也许对标准有更多了解的人会更了解这一点。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)