If USE_STATIC_ASSERT
is 0
, this works as expected (getting indexed type from the list). If 1 the static_assert()
is always tripped. I wo
Even if the partial specialization of items
that contains the static_assert
is not instantiated, the compiler is allowed to reject this code according to §14.6 [temp.res]/p8:
Knowing which names are type names allows the syntax of every template to be checked. No diagnostic shall be issued for a template for which a valid specialization can be generated. If no valid specialization can be generated for a template, and that template is not instantiated, the template is ill-formed, no diagnostic required.
To work around that, you can make the expression in static_assert
dependent on other class template:
#include <type_traits>
template <unsigned int I>
struct AlwaysFalse : std::false_type {};
template <unsigned int I>
struct items<I>
{
static_assert(AlwaysFalse<I>{}, "Ran out of Ts.");
// ~~~~~~~~~~~~~~~^
};