状況はとまったく同じnoexcept(noexcept(...))
です。確かに、これは良いことより悪いことのように聞こえますが、説明させてください。:)私たちはあなたがすでに知っていることから始めます:
C ++ 11には「noexcept
-clauses」と「-expressions」がありnoexcept
ます。彼らは異なることをします。
- noexcept
節は、「この関数は次の場合を除いてはならない...(何らかの条件)」関数の宣言を行い、ブール値のパラメーターを取り、宣言された関数の動作を変更します。
noexcept
-式は、「コンパイラは、言うかどうかを教えてください(一部の表現)がnoexceptです。」それ自体がブール式です。プログラムの動作に「副作用」はありません。コンパイラーに「はい/いいえ」の質問に対する答えを求めているだけです。「この表現は例外ではないのですか?」
-式を- 句内にネストすることもできますが、通常はそのようにするのは悪いスタイルだと考えています。noexcept
noexcept
template<class T>
void incr(T t) noexcept(noexcept(++t)); // NOT SO HOT
noexcept
-式を型特性にカプセル化することは、より良いスタイルと考えられています。
template<class T> inline constexpr bool is_nothrow_incrable_v =
noexcept(++std::declval<T&>()); // BETTER, PART 1
template<class T>
void incr(T t) noexcept(is_nothrow_incrable_v<T>); // BETTER, PART 2
C ++ 2aワーキングドラフトには、「- requires
句」と「requires
- 式」があります。彼らは異なることをします。
- requires
句は、「この関数は...(ある条件)のときにオーバーロードの解決に参加する必要がある」と述べています。関数の宣言を行い、ブール値のパラメーターを取り、宣言された関数の動作を変更します。
requires
-式は、「コンパイラは、言うかどうかを教えてください(表現のいくつかのセット)が整形式です。」それ自体がブール式です。プログラムの動作に「副作用」はありません。コンパイラーに「はい/いいえ」の質問に対する答えを求めているだけです。「この表現は整形式ですか?」
-式を- 句内にネストすることもできますが、通常はそのようにするのは悪いスタイルだと考えています。requires
requires
template<class T>
void incr(T t) requires (requires(T t) { ++t; }); // NOT SO HOT
requires
-式を型特性にカプセル化する方がスタイルが良いと考えられています...
template<class T> inline constexpr bool is_incrable_v =
requires(T t) { ++t; }; // BETTER, PART 1
template<class T>
void incr(T t) requires is_incrable_v<T>; // BETTER, PART 2
...または(C ++ 2aワーキングドラフト)コンセプト。
template<class T> concept Incrable =
requires(T t) { ++t; }; // BETTER, PART 1
template<class T>
void incr(T t) requires Incrable<T>; // BETTER, PART 2
noexcept(noexcept(...))
ます。