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