template<typename T, typename U = void>
struct S { /* static_assert(0, "type unsupported"); */ };
template<typename T>
struct S<T, typename std::enable_if<std::is_integral<T>::value, void>::type> {
void foo() {}
};
...
S<int> i;
i.foo();
S<double> d;
// d.foo();
I would be expecting that the "master template" would never be instantiated for the case of int
, but if I uncomment the static_assert
, the S<int>
instantiation will fail. Even a lone typedef S<int> Si;
would fail to compile. (GCC 4.9.2 Cygwin)
What I aimed to achieve is not for S<double>
to fail at the foo()
call, but at the instantiation of the template itself, and that with a meaningful error message. I'm aware I can do something like typename T::nonexistent_type t;
in the master template which will prevent the template for compiling, but that'd be inferior to a static_assert
message. (Note: putting the static_assert
within a function definition in the master template still fails compilation for S<int>
)
Why does the static_assert
fail even though that template is not instantiated? Is this mandated (or perhaps "unspecified") by the standard? Is there a way to fail with a static_assert
the way I wish to?