C++0x SFINAE問題の解決

以下のコードは、多くのコンパイラでエラーになりますが
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の詳細な仕様は以下のエントリを参照してください。

C++0xのSFINAE仕様



N2634 Solving the SFINAE problem for expressions

C++0x言語拡張まとめ