This syntax was used as a part of an answer to this question:
template
struct static_assert;
template <>
struct static_assert
static_assert<true>(); makes that
template <>
struct static_assert<true> {}
templated struct specialization temporary object creation being done - a call to constructor and later to a destructor that both will be hopefully eliminated by the optimizer since they do nothing. Since there's only a specialization for true and no generic version of the template struct all constructs that evaluate to static_assert<false>(); will just not compile.
In the expression
static_assert<true>();
since static_assert<true> is a type, it will call the constructor of static_assert<true>. As static_assert<true> is specialized to an empty struct, nothing will be affected.
However, in
static_assert<false>();
as there is no specialization for static_assert<false>, the generic definition
template <bool>
struct static_assert;
will be used. But here, the type static_assert<B> is incomplete. So calling constructor of static_assert<B> will result in compilation error.
Therefore, this is called "static assert" as the statement will abort the compilation if the expression evaluates to false, similar to the normal assert() function that will kill the program in runtime.
STATIC_ASSERT(true);
indeed means
static_assert<true>();
which evaluates to nothing. static_assert<true> is just an empty structure without any members. static_assert<true>() creates an object of that structure and does not store it anywhere.
This simply compiles and does nothing.
On the other hand
STATIC_ASSERT(false);
means
static_assert<false>();
which results in compilation error. static_assert has no specialization for false. So a general form is used. But the general form is given as follows:
template <bool>
struct static_assert;
which is just a declaration of a structure and not its definition. So static_assert<false>() causes compilation error as it tries to make an object of a structure which is not defined.
Well, I guess it is about template specialization. STATIC_ASSERT(true) will compile successfully, because there is a definition (not just a declaration) of "static_assert< true >".
STATIC_ASSERT(false) will be rejected by the compiler, because there is only a declaration for "static_assert< false >" and no definition.
Update: for visual studio, STATIC_ASSERT(true) is ok, but STATIC_ASSERT(false) triggers the error: "error C2514: 'static_assert<__formal>' : class has no constructors [ with __formal = false ]"