MSVC10 SFINAE, вызывающий фатальную ошибку, а не сбой замены

#templates #sfinae #c 11 #visual-studio-2010

#шаблоны #sfinae #c 11 #visual-studio-2010

Вопрос:

Здесь у меня есть (относительно) краткий пример кода.

 #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(amp;lols::x);
    func(amp;lols::y);
}
  

MSVC выдает это, говоря, что type не является членом enable_if<false, int> , что является своего рода точкой. Чего я не понимаю, так это почему это вызывает фатальную ошибку, а не просто сбой замены — в GCC этот код ведет себя точно так, как ожидалось, и компилируется чисто.

Комментарии:

1. Они внедрили SFIAFE по ошибке: (

Ответ №1:

clang компилирует и запускает ваш код без жалоб.

Комментарии:

1. Какая версия, какой c stdlib?

2. Я запустил что-то очень близкое к tip-of-trunk вместе с libc .

3. Также отлично компилируется в GCC 4.6.