我只是认为static_assert
被定义为static_assert-declaration
。
据我了解,声明应引入名称,函数名称/对象名称或类型名称。 static_assert
不符合此要求。这不直观。
那么为什么static_assert
被定义为声明而不是postfix-expression
声明?
遵循标准的相关部分:
static_assert-declaration:
static_assert ( constant-expression , string-literal ) ;
答案 0 :(得分:7)
首先,静态断言和经典常规assert
之间的最大区别在于assert
是可执行断言。它是一个运行时断言,必须执行才能完成它的工作。因此,它必须是陈述或表达。 (它恰好是一个表达式。)同时,静态断言的工作方式完全不同:不是可执行的断言,它是编译时断言。因此,它自然不仅仅是一种陈述或表达。
其次,它必须能够出现在不允许表达式出现的地方 - 在命名空间范围内和类成员声明中。为了支持这种安置,它必须是宣言或全新的东西。语言作者决定不引入新的实体,只是将其作为声明。
第三,在C ++ 11中,声明不一定引入名称。例如,C ++ 11支持空声明和属性声明,两者都不引入名称。特别是出于这个原因,在C ++ 11中,声明的基本概念的描述已从
更改声明会将名称引入翻译单元或重新声明 先前声明引入的名称。 (C ++ 03)
到
声明可能在翻译单元中引入一个或多个名称 或重新声明先前声明引入的名称。 (C ++ 11)