[英]What's the point of temporary bound to a member lifetime statement in C++ Standard?
在這個問題中,用戶Happy Mittal引用了C ++ 03標准的第12.2.5節: 構造函數的ctor-initializer(12.6.2)中的引用成員的臨時綁定一直存在,直到構造函數退出 。
這怎么可能有用呢? 我的意思是一旦構造函數退出臨時被破壞,但引用仍然綁定 - 現在已經被破壞的對象。
如果在外部對象的整個生命周期中仍然存在懸空引用,那么如何仔細指定臨時生命周期又有什么意義呢? 在哪種情況下這種行為有用嗎?
將引用成員綁定到死對象是沒有用的,但是明確指出綁定到引用時的“正常”臨時生命周期擴展在這種情況下不適用是有用的。
它還指定了臨時生命周期擴展,它特別適用於ctor初始化器:它延伸到ctor的末尾,而不是在ctor體執行之前死亡。 除了“巧妙”類之外,這一點沒有用,它的全部意義在於執行ctor,並且正確地避免了這種類型的(ab)使用。
我知道后者沒有現實世界的例子,但它讓我感覺類似於讓析構函數默認情況下破壞了在他們的生命中“聰明”以及如何使用它們的類。 這確實有現實的用途和想出了在如何處理dtors的默認語義的C ++ 0x的討論。
在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 ) {}
};
它對編譯器編寫者很有用。 他們已經有了邏輯來破壞作用域末尾的綁定臨時對象,構造函數的退出就是這樣一個點。 有了這個規則,編譯器就可以重用這一點來摧毀這些臨時工。
請注意,標准確實應該決定一些生命周期,唯一的另一個合理點是在ctor初始化列表之后但在ctor體之前。 這不是臨時銷毀的點,否則會干擾函數范圍try {} catch()
塊(包括ctor初始化列表)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.