簡體   English   中英

在C ++標准中臨時綁定到成員生命周期語句的重點是什么?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM