Вам нужно взглянуть на определение макроса STATIC_ASSERT
, чтобы увидеть, что именно происходит.Обычная реализация STATIC_ASSERT
, которую можно использовать там, может быть:
#define STATIC_ASSERT( x ) \
typedef char static_assert_failed[ (x) ? 1 : -1 ]
Обычно есть немного больше хитрости, чтобы номер строки был частью typedef, так что более одного STATIC_ASSERT
может использоваться в том же контексте, но вы можете видеть, что это разрешено, поскольку оно расширится до допустимого кода в определении структуры:
template<typename T, int N, (and so on...)>
struct Settings{
static const int n = N;
typedef char static_assert_failed[ (n == 5) ? 1 : -1 ];
typedef typename T GAGA;
}