여기 (비교적) 간단한 코드 샘플이 있습니다.대체 오류가 아닌 치명적인 오류가 발생하는 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에서이 코드가 예상대로 작동하고 정상적으로 컴파일되면 GCC에서 대체 오류가 아닌 치명적인 오류가 발생하는 이유가 없습니다.
그들은 실수로 SFIAFE를 구현했습니다 : ( –