首页 > 解决方案 > 我可以定义一个 constexpr 匿名/未命名变量吗?

问题描述

错误地,我写了一些类似 的东西constexpr bool{};,虽然 GCC 和 Clang 拒绝了它,但 MSVC 非常乐意编译它(参见Godbolt)。据我了解,在编译时评估的函数(以及构造函数)不会产生副作用,因此这永远不会产生任何影响,但它确实不正确吗?

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

标签: c++language-lawyerc++17constexpr

解决方案


那只是无效的语法。由于不是可能的语法产生,它被标准“禁止”。

声明如

constexpr bool b{};

是一个简单的声明并且具有语法decl-specifier-seq init-declarator-list (opt) ;(参见 C++17 [dcl.dcl]/1)。关键字constexprdecl-specifier,也是如此bool(尽管只有一些 decl-specifiers 对类型有影响;bool有,但constexpr没有)。

声明的其余部分b{}, 是一个init-declarator,它由一个声明器和一个可选的初始化器组成,在这种情况下是{}. (参见 [dcl.decl]/1。)声明符是b. 通常,声明符必须包含标识符,例如b. 见 [dcl.decl]/4。

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

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


推荐阅读