SFINAE, чтобы протестировать бесплатную функцию из другого пространства имен

Я пытался придумать хак, чтобы проверить, определяется ли std :: isnan без специальных компиляторов корпуса в препроцессоре, и придумал следующее, что я ожидая нормально работать.

#include 
#include 

namespace detail {
    using namespace std;

    struct dummy {};
    void isnan(dummy);

    //bool isnan(float); // Just adding this declaration makes it work!

    template 
    struct is_isnan_available {
        template 
        static decltype(isnan(T1())) test(int);
        template 
        static void test(...);

        enum { value = !std::is_void(0))>::value };
    };
}

int main() {
    return detail::is_isnan_available::value;
}

Оказывается он не обнаруживает . Я точно знаю, что std :: isnan определен на ideone, потому что я тестировал это вручную.

И когда я раскомментирую отмеченную строку выше , это работает.

Что мне здесь не хватает? Чем объясняется такое поведение?

8
задан R. Martinho Fernandes 6 January 2012 в 10:57
поделиться