我错误地写了一些类似于 constexpr bool{};
的内容,虽然 GCC 和 Clang 拒绝了这一点,但 MSVC 非常乐意编译它(请参阅 Godbolt )。根据我的理解,在编译时评估的函数(以及构造函数)不会有副作用,因此这永远不会有任何影响,但它确实是格式错误的吗?
(根据我的经验,MSVC 往往是错误的,但在这种特定情况下,我没有找到标准禁止这样做的地方。)
最佳答案
这只是无效的语法。由于它不是可能的语法产生式,因此被标准“禁止”。
诸如此类的声明
constexpr bool b{};
是一个简单声明,语法为decl-specifier-seq init-declarator-list(opt) ;
(请参阅 C++17 [dcl.dcl]/1)。关键字 constexpr
是一个 decl 说明符,bool
也是一个(尽管只有某些 decl 说明符对类型有影响; >bool
会,但 constexpr
不会)。
声明的其余部分,b{}
,是一个初始化声明符,由一个声明符加上一个可选的声明符组成>初始化程序,在本例中为 {}
。 (参见 [dcl.decl]/1。)声明符是 b
。一般来说,声明符必须包含一个标识符,例如b
。请参阅 [dcl.decl]/4。
有一个类似的语法产生式,称为抽象声明符,它缺少标识符(请参阅[dcl.name]/1)。在特定上下文中允许使用抽象声明符,例如在写下type-id时,或在parameter-declaration-clause中(函数参数允许未命名)。但是,init-declarator 必须包含声明符,而不是抽象声明符。
也没有其他语法产生式与 constexpr bool{};
匹配。
关于c++ - 我可以定义 constexpr 匿名/未命名变量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59164582/