戻り値の型とテンプレート パラメーターにおける SFINAE の動作の差異
C では、代替失敗はエラーではない (SFINAE) イディオムにより条件付きが可能になりますテンプレートのメタプログラミングと型の特性に基づいた関数のオーバーロード。ただし、関数テンプレート宣言内の配置に応じて SFINAE の動作が異なる場合があります。
次のコードを考えてみましょう。
template<typename T, typename = typename std::enable_if< std::is_integral<T>::value>::type> void foo(T); // Incorrect placement, triggers error template<typename T, typename = typename std::enable_if< std::is_floating_point<T>::value>::type> void foo(T); // Incorrect placement, triggers error template<typename T> void foo(T) // Correct placement -> typename std::enable_if< std::is_integral<T>::value>::type; template<typename T> void foo(T) // Correct placement -> typename std::enable_if< std::is_floating_point<T>::value>::type;
最初のオーバーロード セット (不適切な配置) では、戻り値の型ではなく SFINAE をテンプレート パラメーターに配置すると、コンパイル エラーが発生します。これは、デフォルトのテンプレート引数 (この場合は ::type サフィックス) がオーバーロードの等価性を決定する際に考慮されないためです。その結果、コンパイラは関数を同じシグネチャを持つ重複した宣言として扱います。
ただし、オーバーロードの 2 番目のセット (正しい配置) では、SFINAE が戻り値の型に適用され、これにはテンプレートのメタプログラミングが含まれます。この配置により、テンプレート パラメーターを参照する式が関数シグネチャの一部となることが保証されます。その結果、コンパイラはオーバーロードを別個のエンティティとして認識し、SFINAE が適切に機能できるようになります。
以上がSFINAE の動作は、C 関数オーバーロードの戻り値の型とテンプレート パラメーターの間でどのように異なりますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。