MSVC10 SFINAE вызывает фатальную ошибку, а не ошибку замещения - PullRequest
1 голос
/ 15 мая 2011

У меня здесь (относительно) пример краткого кода.

#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 этот код работает точно так, как ожидается, и компилируется без ошибок.

1 Ответ

1 голос
/ 15 мая 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...