为什么static_assert是C ++语法中的声明而不是postfix-expression?

时间:2013-10-17 04:10:30

标签: c++ syntax

我只是认为static_assert被定义为static_assert-declaration

据我了解,声明应引入名称,函数名称/对象名称或类型名称。 static_assert不符合此要求。这不直观。

那么为什么static_assert被定义为声明而不是postfix-expression声明?

遵循标准的相关部分:

static_assert-declaration:
     static_assert ( constant-expression , string-literal ) ;

1 个答案:

答案 0 :(得分:7)

首先,静态断言和经典常规assert之间的最大区别在于assert可执行断言。它是一个运行时断言,必须执行才能完成它的工作。因此,它必须是陈述或表达。 (它恰好是一个表达式。)同时,静态断言的工作方式完全不同:不是可执行的断言,它是编译时断言。因此,它自然不仅仅是一种陈述或表达。

其次,它必须能够出现在不允许表达式出现的地方 - 在命名空间范围内和类成员声明中。为了支持这种安置,它必须是宣言或全新的东西。语言作者决定不引入新的实体,只是将其作为声明。

第三,在C ++ 11中,声明不一定引入名称。例如,C ++ 11支持空声明和属性声明,两者都不引入名称。特别是出于这个原因,在C ++ 11中,声明的基本概念的描述已从

更改
  

声明会将名称引入翻译单元或重新声明   先前声明引入的名称。 (C ++ 03)

  

声明可能在翻译单元中引入一个或多个名称   或重新声明先前声明引入的名称。 (C ++ 11)