我有一個(相對)簡短的代碼示例在這裏。MSVC10 SFINAE導致致命的錯誤,而不是替代失敗
#include <type_traits>
template<typename T> class function;
template<typename Ret> class function<Ret()> {
public:
template<typename Func> function(Func f, typename std::enable_if<std::is_same<Ret, decltype(f())>::value, int>::type x = 0) {
}
};
template<typename Ret, typename A1> class function<Ret(A1)> {
public:
template<typename Func> function(Func f, typename std::enable_if<std::is_same<Ret, decltype(f(*((A1*)nullptr)))>::value, int>::type x = 0) {
}
};
namespace lols {
int x() { return 0; }
int y(int) { return 0; }
}
void func(function<int()>) {}
void func(function<int(int)>) {}
int main() {
func(&lols::x);
func(&lols::y);
}
MSVC拋出此,說type
不是enable_if<false, int>
一員,這是一種點的。我沒有得到的是爲什麼這會導致一個致命的錯誤,而不僅僅是一個替代失敗 - 在GCC上,這個代碼的行爲與預期完全一致,並且乾淨地編譯。
他們錯誤地實現了SFIAFE :( – 2011-05-15 16:28:15