[英]Lifetime of temporary bound to aggregate initialized struct member
给出以下代码:
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
的生命周期是匹配foo_holder
生命周期,根据§3.7.5/ 1:
成员子对象,基类子对象和数组元素的存储持续时间是其完整对象的存储持续时间(1.8)。
考虑引用可能有点棘手,因为§3.8/ 1表明,当存储被释放或重用时,对象的生命周期结束:
类型T的对象的生命周期在以下情况下结束:
- 如果T是具有非平凡析构函数(12.4)的类类型,则析构函数调用开始,或者
- 重用或释放对象占用的存储空间。
但是,引用是否使用存储是未指定的; §8.3.2/ 4说
未指定参考是否需要存储(3.7)。
也许对标准有更好了解的人会更好地了解这一点。
我在comp.std.c ++上得到了答案:
http://groups.google.com/group/comp.std.c++/msg/9e779c0154d2f21b
基本上,该标准没有明确解决它; 因此,它应该与本地声明的引用相同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.