C 11 SFINAE の「即時コンテキスト」とは何ですか?
C 11 の置換では「即時コンテキスト」の概念が重要です失敗はエラーではない (SFINAE) のイディオム。 C 11 標準によれば、関数型とそのテンプレート パラメーター型の「直接のコンテキストで」無効な型と式のみが推論失敗の原因となります。
初期理解
標準は注記で限定的なヒントを提供しています:「置換された型と式の評価は、クラス テンプレートの特殊化、関数テンプレートの特殊化、暗黙的な関数などの副作用を引き起こす可能性があります。」世代など。」これらの副作用は、「直接コンテキスト」の一部とはみなされません。
決定手順
「直接コンテキスト」で置換エラーが発生したかどうかを判断するには、次に従います。手順:
コンクリート例
template<typename T> void func(typename T::type* arg);
func<A<int&>&>(nullptr); // T::type* is invalid, causing a hard error.
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 サイトの他の関連記事を参照してください。