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

Emm*_*a X 8 c++ language-lawyer constexpr c++17

错误,我写了线沿线的东西constexpr bool{};,虽然GCC和锵拒绝了这个,MSVC更乐意编译它(见Godbolt)。根据我的理解,在编译时评估的函数(以及构造函数)不会有副作用,因此这永远不会有任何影响,但它确实是格式错误的吗?

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

Bri*_*ian 8

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

声明如

constexpr bool b{};
Run Code Online (Sandbox Code Playgroud)

是一个简单的声明,语法为decl-specifier-seq init-declarator-list (opt) ;(参见 C++17 [dcl.dcl]/1)。关键字constexpr是一个decl-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{};

  • @EmmaX 诸如“bool{}”之类的函数式转换要求类型为*简单类型说明符*或*类型名称说明符*。请参阅[expr.post]/1、[expr.type.conv]。这比 *type-id* 更具限制性。`const bool` 不符合 *简单类型说明符* 的语法。要使用通用 *type-id* 进行强制转换,必须将其用括号括起来,或使用 C++ 样式强制转换。 (2认同)