C 11 SFINAE の即時コンテキスト
C 11 標準では、条件付きで有効にする手法として SFINAE (置換失敗はエラーではない) が定義されています。または、テンプレート引数の推論に基づいてコードを無効にします。セクション 14.8.2/8 では、置換失敗により SFINAE につながる「ハード」コンパイル エラーまたは「ソフト」エラーが発生する条件について概説しています。
このセクションでは、標準では「即時コンテキスト」について言及しています。これは、関数型とそのテンプレート パラメーター型の直接のコンテキストにある無効な型と式のみが演繹失敗の原因となる可能性があることを示しています。ただし、「即時コンテキスト」の定義は明示的ではありません。
即時コンテキストの決定手順
即時コンテキストで置換エラーが発生するかどうかを判断するには、以下:
テンプレート引数の置換に必要なすべてのテンプレートと暗黙的に定義された関数が生成されると想像してください。事前に。この準備中に発生するエラーは直接的なコンテキストではなく、ハード コンパイル エラーになります。
準備ステップが正常に完了すると、その後の置換中のエラー (インスタンス化されたテンプレートや暗黙的に定義された関数の参照など)関数テンプレートの署名内) はエラーにはなりませんが、減点の対象になります
例
例 1:
template<typename T> void func(typename T::type* arg); template<typename> void func(...); template<typename T> struct A { typedef T* type; }; func<A<int&>>(...);
この例では、インスタンス化A
例 2:
template<typename T> void func(typename T::type* arg); template<typename> void func(...); template<typename T> struct A { typedef T* type; }; template<> struct A<char> {}; func<A<char>>(...);
この例では、準備ステップで A
以上がC 11 SFINAE における「即時コンテキスト」とは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。