static_assert在哪里实施?

Where is static_assert implemented?

static_assert 的方式是 implemented in the Loki 库(实际上它是一个名为 STATIC_CHECK 的预处理器宏),它可以按如下方式使用:

STATIC_CHECK(myCondition, My_Error_Message); 

请注意 My_Error_Message 必须是有效的标识符。

我想知道 static_assert 是如何为 C++11 标准实现的,以便为错误消息采用字符串文字参数。

我决定查看 type_traits 包含文件,该文件位于我的 Ubuntu 14.04 上的 /usr/include/c++/4.8 和 g++ 4.8.2。令我惊讶的是,我在那里只找到了 static_assert 的用法,但没有找到定义(也没有预处理器宏)。我也没有在 type_traits 包含的文件中找到它。

那么,我在哪里寻找 static_assert 的实现?

static_assert 是 C++11 中新的语言级特性,而不是包含在头文件中的库。一个兼容的 C++ 实现可以随意实现 static_assert 但它喜欢。它可以内置到编译器中(我怀疑大多数编译器都这样做),或者它可以是库的一部分(尽管这将具有挑战性,因为 static_assert 不需要头文件)。我认为找出适合您的特定编译器的最佳方法是检查文档,并在必要时查看源代码。

static_assert 必须固有地内置到编译器中,因为必须在编译时检查您检查的条件。如果要用一些库代码检查它,这宁愿在运行时完成。

另一方面,assert 是一个宏,它已经在库代码中实现,并且它的检查是在运行时完成的。