C++11 静态断言在哪里实现?

C++11 静态断言在哪里实现?,c++11,typetraits,C++11,Typetraits,static\u assert的方式在库中(它实际上是一个名为static\u CHECK的预处理器宏),可以按如下方式使用: STATIC_CHECK(myCondition, My_Error_Message); 请注意,My\u Error\u Message必须是有效的标识符 我想知道C++11标准是如何实现的,以获取错误消息的字符串文本参数 我决定研究type\u traitsinclude文件,该文件位于我的Ubuntu 14.04上的/usr/include/c++/4.8,其

static\u assert
的方式在库中(它实际上是一个名为
static\u CHECK
的预处理器宏),可以按如下方式使用:

STATIC_CHECK(myCondition, My_Error_Message); 
请注意,
My\u Error\u Message
必须是有效的标识符

我想知道
C++11
标准是如何实现的,以获取错误消息的字符串文本参数

我决定研究
type\u traits
include文件,该文件位于我的Ubuntu 14.04上的
/usr/include/c++/4.8
,其中包含g++4.8.2。令我惊讶的是,我发现这里只使用了
static\u assert
,而没有定义(也没有预处理器宏)。我在
type\u traits
中包含的文件中也没有找到它


那么,我在哪里寻找
静态断言的实现呢?

静态断言是C++11中新的语言级功能,而不是包含在头文件中的库。一个兼容的C++实现可以自由实现<代码> StistaSytRe> <代码>,但是它喜欢。它可以内置在编译器中(我怀疑大多数编译器都会这样做),也可以是库的一部分(尽管这很有挑战性,因为
static\u assert
不需要头文件)。我认为最好的方法是检查文档,如果有必要,还可以查看源代码。

static\u assert
必须内置在编译器中,因为必须在编译时检查检查条件。如果要用一些库代码检查它,那么最好在运行时进行检查


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

Nice。这就解释了两件事。首先,它解释了为什么它是
static\u assert
而不是
std::static\u assert
。第二,它消除了Alexandrescu忽略了更好的解决方案的怀疑。C++中实际上可以通过使用模板系统来构建编译时检查条件的库(参见OP的原始问题的链接)。这些库相当复杂,但仍然有可能发生。@MeirGoldenberg在给定条件的情况下导致编译错误非常简单,在编译时计算该条件。但是,该消息必须包含在诊断中,这并不简单,也不能保证能够跨编译器工作。但这不是您在回复中所写的。