ホームページ >バックエンド開発 >C++ >C 11 SFINAE の「直接コンテキスト」は何で構成されますか?

C 11 SFINAE の「直接コンテキスト」は何で構成されますか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-10 18:12:11799ブラウズ

What Constitutes the

C 11 SFINAE の「即時コンテキスト」とは何ですか?

C 11 の置換では「即時コンテキスト」の概念が重要です失敗はエラーではない (SFINAE) のイディオム。 C 11 標準によれば、関数型とそのテンプレート パラメーター型の「直接のコンテキストで」無効な型と式のみが推論失敗の原因となります。

初期理解

標準は注記で限定的なヒントを提供しています:「置換された型と式の評価は、クラス テンプレートの特殊化、関数テンプレートの特殊化、暗黙的な関数などの副作用を引き起こす可能性があります。」世代など。」これらの副作用は、「直接コンテキスト」の一部とはみなされません。

決定手順

「直接コンテキスト」で置換エラーが発生したかどうかを判断するには、次に従います。手順:

  1. 必要なテンプレートを特定し、関数: 引数の置換に必要なすべてのテンプレートと暗黙的に定義された関数を検討します。
  2. インスタンス化前のステップ: 置換前にこれらのテンプレートと関数を生成することを想像してください。
  3. 直接エラー: このインスタンス化前のステップ中にエラーが発生した場合、それらは直接コンテキストがあり、ハード コンパイル エラーが発生します。
  4. 演繹失敗: 事前インスタンス化が成功した場合、その後の置換中のエラーはエラーではなく、演繹失敗となります。

コンクリート例

  • 例 1 (ハード エラー):
template<typename T>
void func(typename T::type* arg);
func<A<int&>&>(nullptr); // T::type* is invalid, causing a hard error.
  • 例 2 (控除失敗):
template<typename T>
void func(typename T::type* arg);
template<>
struct A<char> {};
func<A<char>>(nullptr); // T::type* is not defined, leading to a deduction failure.

結論

「直接コンテキスト」とは、次の式と型を指します。必要な事前インスタンス化ステップを超えて、追加のテンプレートや関数生成を必要とせずに解決されます。このインスタンス化前の段階でエラーが発生するとハード コンパイル エラーが発生し、後続の置換段階でのエラーは演繹エラーの原因となります。

以上がC 11 SFINAE の「直接コンテキスト」は何で構成されますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。