我可以定义一个 constexpr 匿名/未命名变量吗?

Can I define a constexpr anonymous/unnamed variable?

本文关键字:匿名 未命名 变量 constexpr 一个 定义 我可以      更新时间:2023-10-16

我错误地按照constexpr bool{};写了一些东西,虽然GCC和Clang拒绝了这一点,但MSVC非常乐意编译它(见Godbolt(。根据我的理解,在编译时计算的函数(以及构造函数(不会有副作用,因此这永远不会有任何影响,但它确实格式不正确吗?

(根据我的经验,MSVC 往往是错误的,但在这种特定情况下,我没有找到标准禁止这样做的地方。

这不是有效的语法。它被标准"禁止",因为它不是可能的语法生产。

声明,例如

constexpr bool b{};

是一个简单声明,具有语法decl-specifier-seqinit-declarator-list(opt(;(请参阅 C++17 [dcl.dcl]/1(。关键字constexprdecl 说明符bool也是如此(尽管只有一些 decl-specifier 对类型有影响;bool有,但constexpr没有(。

声明的其余部分b{}是一个init 声明符,它由一个声明符和一个可选的初始值设定项组成,在本例中为{}。(参见 [dcl.decl]/1。声明符b。通常,声明符必须包含标识符,例如b。见[dcl.decl]/4。

有一个类似的语法生产,称为抽象声明器,它缺少标识符(参见[dcl.name]/1(。在特定上下文中允许使用抽象声明符,例如在写下类型 ID时或在参数声明子句中(允许函数参数未命名(。但是,初始化声明符必须包含声明符,而不是抽象声明符

也没有其他语法生产可以与constexpr bool{};相匹配。