请帮助我理解这种语法(在C++中实现静态断言)

Laz*_*zer 6 c++ syntax templates metaprogramming

此语法用作此问题答案的一部分:

template <bool>
struct static_assert;

template <>
struct static_assert<true> {}; // only true is defined

#define STATIC_ASSERT(x) static_assert<(x)>()
Run Code Online (Sandbox Code Playgroud)

我不明白那种语法.它是如何工作的?

假设我这样做

STATIC_ASSERT(true);
Run Code Online (Sandbox Code Playgroud)

它被转换为

static_assert<true>();
Run Code Online (Sandbox Code Playgroud)

怎么办?

Ada*_*ura 13

STATIC_ASSERT(true);
Run Code Online (Sandbox Code Playgroud)

确实意味着

static_assert<true>();
Run Code Online (Sandbox Code Playgroud)

评估为空.static_assert<true>只是一个没有任何成员的空结构.static_assert<true>()创建该结构的对象,而不是将其存储在任何地方.

这简单地编译并且什么都不做.

另一方面

STATIC_ASSERT(false);
Run Code Online (Sandbox Code Playgroud)

手段

static_assert<false>();
Run Code Online (Sandbox Code Playgroud)

这导致编译错误.static_assert没有专业化false.所以使用一般形式.但一般形式如下:

template <bool>
struct static_assert;
Run Code Online (Sandbox Code Playgroud)

这只是一个结构的声明,而不是它的定义.因此static_assert<false>(),在尝试创建未定义的结构的对象时会导致编译错误.


sha*_*oth 9

static_assert<true>(); 这样做

template <>
struct static_assert<true> {}
Run Code Online (Sandbox Code Playgroud)

模板化结构专门化临时对象创建正在完成 - 对构造函数的调用以及稍后对析构函数的调用,两者都有望被优化器消除,因为它们什么都不做.因为只有一个专门化true而且没有通用版本的模板结构,所有评估的结构都static_assert<false>();将无法编译.