[英]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.