以下のコードは、多くのコンパイラでエラーになりますが
C++03 ではこれを禁止する規定はありません。
template <int I> struct A {}; char xxx(int); char xxx(float); template <class T> A<sizeof(xxx((T)0))> f(T){} int main() { f(1); }
これが問題になる理由は
・実装が難しいから
・名前解決と ABI に影響があるから
・標準でどう規定するかを指摘する必要があったから
C++0x では、 decltype や constexpr などの新機能の追加により状況が変わりました。
(このままにしておくと問題がもっと大きくなる)
そのため、 SFINAE の扱いを明確にするために、 SFINAE failure ではないエラーを列挙することになりました。
・式の外部の構成要素(テンプレートのインスタンス化、暗黙に宣言されるコピーコンストラクタ)の生成中に発生するエラー
・実装制限によるエラー
・アクセス違反によるエラー
この SFINAE 仕様の明確化により、今まで曖昧だった部分は既存コードに影響が発生するかもしれませんが
それは古い仕様のバグとみなされます。
SFINAEの詳細な仕様は以下のエントリを参照してください。
N2634 Solving the SFINAE problem for expressions