Dlaczego is_constructible twierdzi, że coś jest konstruktywne, gdy nie jest?

Poniższy program, skompilowany z GCC 4.7 i Clang 3.2, produkuje „1” jako wyjście.

#include <type_traits>

struct foo {
    template<typename T>
    foo(T) {
        static_assert(not std::is_same<int, T>(), "no ints please");
    }
};

#include <iostream>    
int main() {
    std::cout << std::is_constructible<foo, int>();
}

To jest mylące.foo jest wyraźnie nie do skonstruowaniaint! Jeśli się zmienięmain w następnej kolejności oba kompilatory odrzucają go ze względu na niepowodzenie statycznego stwierdzenia:

int main() {
    foo(0);
}

Dlaczego obaj kompilatorzy twierdzą, że jest to możliwe?

questionAnswers(2)

yourAnswerToTheQuestion