2

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

据我了解,声明应该引入名称、函数名称/对象名称或类型名称。static_assert不适合这个。这并不直观。

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

遵循标准的相关部分:

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

1 回答 1

7

首先,静态断言和经典正则的最大区别在于assertassert是一个可执行断言。这是一个运行时断言,必须执行才能完成其工作。因此,它必须是语句或表达式。(它恰好是一个表达式。)同时,静态断言的工作方式完全不同:它不是一个可执行断言,它是一个编译时断言。因此,它自然不限于作为语句或表达式。

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

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

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

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

于 2013-10-17T04:48:40.270 回答