ホームページ >バックエンド開発 >C++ >C 11 SFINAE の「即時コンテキスト」とは何ですか? また、それは置換の失敗にどのような影響を与えますか?

C 11 SFINAE の「即時コンテキスト」とは何ですか? また、それは置換の失敗にどのような影響を与えますか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-12 19:10:111065ブラウズ

What is the

C 11 SFINAE の「即時コンテキスト」を理解する

C 11 標準では、置換失敗によりハード コンパイルが発生する場合の条件を指定しています。エラー、または単にオーバーロード解決候補からテンプレートを破棄するソフト エラー。この決定における重要な概念の 1 つは、「即時コンテキスト」です。

「即時コンテキスト」の定義

「即時コンテキスト」という用語は、規格で簡単に言及されています。しかし、その正確な定義は明示的には提供されていません。ただし、多くの場合、次のテキストと組み合わせて使用​​されます。

Note: The evaluation of the substituted types and expressions can result in side effects such as instantiation of template specializations, generation of implicitly-defined functions, etc. Such side effects are not in the “immediate context” and can result in the program being ill-formed.

この注記は、テンプレートのインスタンス化や暗黙的な関数定義など、置換プロセス中に発生する副作用は、即時コンテキスト。

即時コンテキストの置換エラーの判断コンテキスト

即時コンテキストで置換エラーが発生するかどうかを判断するには、次の手順を検討します。

  1. 副作用を特定する: すべてをインスタンス化することを想像してください。テンプレートと、テンプレート引数に必要なすべての暗黙的な関数の定義
  2. エラーのチェック: この「準備」段階でエラーが発生した場合、それらは直接のコンテキストの一部ではないため、ハード コンパイル エラーが発生します。
  3. 引数の置換: 必要なインスタンス化と定義がすべてエラーなく生成されたら、関数テンプレートの引数に引数を置換します。 Signature.
  4. 置換中にエラーがないか確認します: この最後の置換ステップ中にエラーが発生した場合、それらは真のエラーではなく、推定の失敗です。

次のテンプレートとフォールバックを考えてみましょうfunction:

template<typename T>
void func(typename T::type* arg);

template<>
void func(...);
  1. ケース 1: A が型メンバーを持つテンプレートであると仮定すると、 func::type*>(nullptr) の呼び出し) A をインスタンス化するため、ハード コンパイル エラーで失敗します。 (準備中) 参照への無効なポインタが作成されます。
  2. ケース 2: A に char の明示的な特殊化がある場合、 func::type*> の呼び出し;(nullptr) は A をインスタンス化します。 (準備は成功します)、その後の A::type の置換 (最終ステップ) は、存在しないため失敗します。これにより推論が失敗し、フォールバック関数が使用されます。

結論

直接のコンテキストの概念を理解することで、いつコンテキストが発生するかをより適切に識別できるようになります。置換エラーはハード コンパイル エラーまたはソフト推定エラーを引き起こし、C 11 で SFINAE を効果的に使用できるようになります。

以上がC 11 SFINAE の「即時コンテキスト」とは何ですか? また、それは置換の失敗にどのような影響を与えますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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