10

アトミックな time_point を保持しようとしてこの問題が発生しました。参照してください (デフォルトのコンストラクターが利用可能な場合、アトミックには noexcept デフォルトのコンストラクターが必要です): http://cplusplus.github.io/LWG/lwg-active.html#2165

単純な問題は、std::atomic または同様のものが現在の std の下でコンパイルに失敗することです。

std::chrono::clock_type::now() を考慮すると、 noexcept です。タイムポイント自体がそうではないのは奇妙に思えます。

4

1 に答える 1

9

私の謙虚な意見では、それらは条件付き 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)));

これは、一般的なユースケースを除いて、noexcept になることを意味します。ただし、Rep(たとえば) オーバーフローでスローされる可能性のある算術エミュレーターである を作成すると、これらのコンストラクターは正しく になりませんnoexcept

これらのコンストラクターを実際に機能させるには、メンバー関数count()を conditionallyにする必要がnoexceptあり、関数を conditionally にするduration_cast必要がありますnoexcept

今(そして今だけ)time_point、同様の厳密さでコンストラクターに取り組み始めることができます。

これはすべて実行可能です。この回答で実際に良い情報を提供していることを確認するために、プロトタイプを作成しました。ただし、これをすべて std にするには、次のことを行う必要があります。

  1. 全体を実装して完全にテストします。
  2. これが実装可能であり、クライアントにとって価値があることを説得力を持って主張する提案を書きます。
  3. 標準化会議に出席してこの提案を提示し、説得力を持ってください。
  4. 委員会があなたの議論に穴を見つけたら (そして彼らはそうするでしょう)、実装を修正し、提案を修正して、ステップ 3 に戻ります。
  5. ステップ 3 と 4 を続けて、委員会があなたからの連絡にうんざりし、賛成票を投じて基準草案を作成します。
  6. ドラフトが公式の標準になるのを待ち、待っている間、提案が標準から外れるのを防ぎます。

今日まで、委員会はnoexcept非常に控えめに機能に条件付きを適用してきました。

タイトルの質問に対する答えは簡単です:

このすべての作業をそれに投入した人は誰もいません。しかし、私は人々にそうすることを勧めます。これは のクライアントに利益をもたらすと信じています <chrono>

于 2014-05-19T00:46:18.900 に答える