constinit
从 C++20 开始可以使用说明符声明结构化绑定吗?
例如
struct A { int i, j; };
constinit auto [x, y] = A{ 0, 1 };
编译器在这方面有些分歧。MSVC 抱怨:
错误 C3694:结构化绑定声明不能包含除“static”、“thread_local”、“auto”和 cv-qualifiers 之外的其他说明符
Clang 紧随其后
错误:分解声明不能声明为“constinit”
但 GCC 只接受该示例。在线演示:https://gcc.godbolt.org/z/jaY7ncsPP
这里哪种实现是正确的?
根据[dcl.constinit]/1:
结构化绑定声明不是变量声明。
还要注意,同样适用于
constexpr
。因为constexpr
GCC 的行为也与其他编译器一致,并拒绝声明。不过,我确实怀疑这个限制是否是标准作者有意为之。目前我想不出原因。
正如 Jonathan Wakely在这里提到的,允许
constexpr
(并且可能通过扩展constinit
)结构化绑定没有任何具体问题,但对于将其添加到标准中的解释存在一些悬而未决的问题。这项工作似乎正在进行中。据我所知,目标是使
constexpr
结构化绑定不仅强制执行constexpr
隐式变量定义,而且还使结构化绑定本身可用于常量表达式,即使变量具有自动存储持续时间。然而,我认为这个更复杂的问题实际上并不相关,因为
constinit
它应该具有相对简单的语义,即添加constinit
到隐式变量定义中,如果该变量具有自动存储持续时间,则应该禁止,就像普通变量声明一样。