我可以定义一个 constexpr 匿名/未命名变量吗?
Can I define a constexpr anonymous/unnamed variable?
我错误地按照constexpr bool{};
写了一些东西,虽然GCC和Clang拒绝了这一点,但MSVC非常乐意编译它(见Godbolt(。根据我的理解,在编译时计算的函数(以及构造函数(不会有副作用,因此这永远不会有任何影响,但它确实格式不正确吗?
(根据我的经验,MSVC 往往是错误的,但在这种特定情况下,我没有找到标准禁止这样做的地方。
这不是有效的语法。它被标准"禁止",因为它不是可能的语法生产。
声明,例如
constexpr bool b{};
是一个简单声明,具有语法decl-specifier-seqinit-declarator-list(opt(;
(请参阅 C++17 [dcl.dcl]/1(。关键字constexpr
是decl 说明符,bool
也是如此(尽管只有一些 decl-specifier 对类型有影响;bool
有,但constexpr
没有(。
声明的其余部分b{}
是一个init 声明符,它由一个声明符和一个可选的初始值设定项组成,在本例中为{}
。(参见 [dcl.decl]/1。声明符b
。通常,声明符必须包含标识符,例如b
。见[dcl.decl]/4。
有一个类似的语法生产,称为抽象声明器,它缺少标识符(参见[dcl.name]/1(。在特定上下文中允许使用抽象声明符,例如在写下类型 ID时或在参数声明子句中(允许函数参数未命名(。但是,初始化声明符必须包含声明符,而不是抽象声明符。
也没有其他语法生产可以与constexpr bool{};
相匹配。
相关文章:
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 为什么未命名的结构内联变量在每个翻译单元中没有相同的地址?
- C++中未命名函数指针的语法
- 未命名的非类型模板参数有什么意义?
- C++包含函数标头会给出错误'__dest'未命名类型
- 不同C++文件中未命名命名空间中的名称可以引用同一个命名事物吗?
- 用于创建未命名实例的语法
- 错误:"cast"未命名类型void setCastDescription(std::string
- 我可以定义一个 constexpr 匿名/未命名变量吗?
- C++ 错误:(类名)未命名类型
- 如何访问嵌套在命名命名空间中的未命名命名空间变量?
- 未命名的函数参数用法
- 使用 std ::transform 构造 std::vector.返回未命名结果的可能性?
- 为什么将字符串输出到未命名的 std::ofstream 反而给了我一个十六进制数?
- 在多个 cpp 文件中重用未命名的命名空间函数
- C++ ,错误:命名空间'std'中的'shared_ptr'未命名模板类型
- src/caffe/parallel.cpp:70:1:错误:“参数”未命名类型
- 错误:'int_type'未命名类型 - 如何继承 typedefs 和用法
- 如何修复错误,迭代器未在此范围内声明,并且迭代器未命名类型'
- 使用 mex 编译库时出错 - __int 64 未命名类型