2011-05-15 4 views
1

여기 (비교적) 간단한 코드 샘플이 있습니다.대체 오류가 아닌 치명적인 오류가 발생하는 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에서 대체 오류가 아닌 치명적인 오류가 발생하는 이유가 없습니다.

+7

그들은 실수로 SFIAFE를 구현했습니다 : ( –

답변

1

clang은 불만없이 코드를 컴파일하고 실행합니다.

+0

어떤 버전? C++ stdlib? – Nils

+0

libC++와 함께 트렁크 끝에 매우 가깝게 달렸습니다. –

+0

GCC 4.6에서도 잘 컴파일됩니다. –

관련 문제