4

N3421 - Making Operator Functors greater<>では、std 関数オブジェクトの新しい特殊化は次のとおりです。

template <> struct plus<void> {
  template <class T, class U> auto operator()(T&& t, U&& u) const
  -> decltype(std::forward<T>(t) + std::forward<U>(u));
};

それ以外の

template <> struct plus<void> {
  template <class T, class U> auto operator()(T&& t, U&& u) const
  noexcept(noexcept(decltype(std::forward<T>(t) + std::forward<U>(u))
                     (std::move(std::forward<T>(t) + std::forward<U>(u)))))
  -> decltype(std::forward<T>(t) + std::forward<U>(u));
};
  • その理由はありますか?
  • noexceptこのユースケースで問題の省略はありますか?

編集: github の作業ドラフト行へのリンク

編集 2: libc++ と特殊化へのリンク

4

2 に答える 2

6

既存の LWG ガイドラインでは、noexcept の使用は推奨されていません。それらは、ワイド コントラクト関数では noexcept を受け入れず、ナロー コントラクトのみを受け入れます。これらの用語がどのように定義されたのか正確には覚えていませんが、私がブリストルの会議に出席して議論noexceptしたことは言えます。

したがって、おそらく 2 つの理由のいずれかで、ここには掲載されていません。noexcept1 つ目は、委員会と論文の著者が、すべてのケースで同様のことを考慮することにまだ慣れていないことconstexprです。この場合、論文の著者 (STL) が単に追加するのを忘れていた可能性があります。

2 つ目は、LWG がいつnoexcept.

于 2014-02-13T14:00:43.250 に答える
4

@DeadMGの回答により、 Library で noexcept を保守的に使用するようになりました。これには、次のように書かれています。

採択されたガイドライン

  • ライブラリ デストラクタはスローしないでください。それらは、暗黙的に提供された (スローしない) 例外仕様を使用するものとします。

  • LWG がスローできないと合意したワイド コントラクトを持つ各ライブラリ関数は、無条件に noexcept としてマークする必要があります。

  • ライブラリ スワップ関数、move-constructor、または move-assignment 演算子が条件付きで広い (つまり、noexcept 演算子を適用することでスローしないことが証明できる) 場合、条件付きで noexcept としてマークする必要があります。他の関数は、条件付きの noexcept 指定を使用してはなりません。

  • 「C」コード (atomics 機能など) との互換性のために設計されたライブラリ関数は、無条件に noexcept としてマークされる場合があります。

ここで、ナロー コントラクトとワイド コントラクトは次のように定義されます。

  • 関数または操作のワイド コントラクトは、未定義の動作を指定しません。このようなコントラクトには前提条件がありません。幅の広いコントラクトを持つ関数は、その引数、オブジェクトの状態、または外部のグローバル状態に追加の実行時制約を課しません。

  • 狭い契約は、広くない契約です。関数または操作の狭い契約は、文書化された契約に違反する方法で呼び出されると、未定義の動作を引き起こします。このようなコントラクトは、その引数、オブジェクトの状態、または静的オブジェクトの初期化などの外部グローバル状態を含む少なくとも 1 つの前提条件を指定します。

そのドキュメントの最後で、以前にマークされた演算子関手noexceptはもはやではありませんnoexcept

したがって、これを正しく理解していれば、新しい演算子ファンクター<functional>はワイド コントラクトを持っていますが、作用する型によってはスローされることがあります。そのため、それらは無条件ではありませんnoexcept(true)。このため、次の決定はライブラリの実装者に任されています。

それらの使用は、より多くの経験が得られるまで、ライブラリベンダーの実装品質機能として残されます。

于 2014-02-13T14:18:20.300 に答える