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?