首页 > 解决方案 > 静态 constinit 成员变量是否与非类型模板参数相同?

问题描述

我有一个 N 维数组的类模板:

template<typename T, std::size_t... Shape>
class ndarray { ... };

这种模板设计的一个结果是,如果您愿意,还有一个额外的“隐式”模板参数:std::size_t Size,所有参数的乘积Shape。我一直在使用 C++17 折叠表达式 ( ),如果它不依赖于,(1 * ... * Shape)我通常会使用它,但我想知道添加以下“别名”是否会导致编译程序集出现任何细微差异:SizeShape

template<typename T, std::size_t... Shape>
class ndarray {
    static constinit std::size_t Size = (1 * ... * Shape);
    ...
};

有趣的是,ISO C++20 标准并没有说明它是否constinit暗示和. 我认为(尤其是与变量相关的)的语义只有在变量 were also 时才真正有意义,但它从标准中省略让我对这个结论持谨慎态度。inlineconstexprconstevalconstinitconstexprinline

标签: c++language-lawyerc++20

解决方案


constinit只有一个语义:用于初始化变量的表达式必须是常量表达式。

而已。这就是它所做的一切:如果初始化表达式不是有效的常量表达式,它会导致编译错误。在所有其他方面,这样的变量与没有变量相同constinit。事实上,该提案的早期版本将 constinit 作为属性而不是关键字,因为它实际上并没有任何事情。它仅对变量的无效初始化给出了编译错误。

对于这种情况,没有理由不制作变量constexpr。您显然不打算更改变量,因此使变量可修改是没有意义的。


推荐阅读