c++ - 我可以定义 constexpr 匿名/未命名变量吗?

标签 c++ language-lawyer c++17 constexpr

我错误地写了一些类似于 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/

相关文章:

c++ - 在嵌套类型名上制作模板的通用方法

c++ - 模板功能图

c++ - SFINAE 检查 operator[] 比我还糊涂?

c++ - 如何在循环中使用更少的 CPU?

c++ - OOP 游戏设计理论

c++ - 再次调用 async_read 会抛出异常

c++ - 非类型模板参数可以是 "void*"类型吗?

c++ - 异常 - VC++2015 CTP Ultimate 中的不正确行为

c++ - 特定于类的释放函数可以在常量表达式中使用吗?

javascript - ECMAScript 规范是否允许 Array 为 "superclassable"?