2014-03-27 36 views
5

我遇到了這個問題試圖抓住一個原子time_point, 見(原子需要noexcept默認的構造函數,如果可用默認構造函數): http://cplusplus.github.io/LWG/lwg-active.html#2165std :: chrono :: ... :: time_point上的構造函數是否應該noexcept? (?或者他們爲什麼不)

簡單的問題是STD: :原子或類似的將無法在當前std下編譯。

考慮到std :: chrono :: clock_type :: now()s是noexcept。 時間點本身並不是奇怪的。

回答

5

在我看來,他們應該是有條件noexcept。爲了描述正確的條件,我們需要備份並討論duration的構造函數。

首先是特殊的構造函數:default和copy。

這些構造函數被正確指定爲= default。這意味着如果底層rep有特殊的noexcept構造函數,那麼duration也會。這正是我們想要的。

現在來談談:

template <class Rep2> 
    constexpr explicit duration(const Rep2& r); 
template <class Rep2, class Period2> 
    constexpr duration(const duration<Rep2, Period2>& d); 

這些都不是目前noexcept,但我們希望他們是如果他們所謂的結構是noexcept。例如:

template <class Rep2> 
    constexpr explicit duration(const Rep2& r) 
     noexcept(is_nothrow_constructible<rep, Rep2 const&>{}); 
template <class Rep2, class Period2> 
    constexpr duration(const duration<Rep2, Period2>& d) 
     noexcept(noexcept(is_nothrow_copy_constructible<rep>{}) && 
       noexcept(std::chrono::duration_cast<duration>(d))); 

這意味着它們將不會被用於常見用例。但是如果你創建一個Rep這是一個可能(例如)拋出溢出的算術模擬器,那麼這些構造函數將不會是noexcept

爲了使這些構造函數的實際工作中,成員函數count()必須是有條件noexcept,並duration_cast需要有條件noexcept做出的功能。

現在(並且只有現在)人們可以開始用類似的嚴謹來解決time_point構造函數。

這都是可行的。我剛剛製作了原型,以確認我實際上在回答中提供了很好的信息。然而,要做到這一切,必須:

  1. 執行並充分測試整個事情。
  2. 撰寫一份令人信服的建議,認爲這是可實施的,對客戶有價值。
  3. 參加標準會議並提出此建議,並具有說服力。
  4. 當委員會在您的論點中找到漏洞(他們會),修復實施,修復提案並返回步驟3.
  5. 繼續執行步驟3和4,直到委員會聽到你說他們放棄並將它投票寫入標準草案。
  6. 等待草案成爲官方標準,並保護建議在等待時被拋出標準。

到目前爲止,委員會已經非常謹慎地應用了條件noexcept

答案在標題的問題很簡單:

沒有人把所有這些工作納入它。不過,我會鼓勵 的人這樣做。我相信這將有益於 <chrono>的客戶。

相關問題