c++ - 我可以定义一个 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-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{};
。
推荐阅读
- javascript - 为每个数组项添加单击
- j - 这个空列表的第一个元素如何为 0?
- javascript - 如何在页面加载时随机播放视频?
- python - 有什么方法可以从 python 文件生成多平台 exe/可执行文件?
- flutter - Flutter,在 image_picker 上出现构建错误:^0.6.0+9
- function - 主机.json;批量大小的含义
- java - SPEL 在 KafkaListener 中不起作用。无法解决财产
- phalcon - Phalcon 在两列的 Query\Builder 中使用 LIKE
- c# - 如何从 DateTime 属性中删除 00:00:00
- c++ - 移动构造函数是否使 shared_from_this 无效