【发布时间】:2021-11-09 06:59:00
【问题描述】:
我有一个 N 维数组的类模板:
template<typename T, std::size_t... Shape>
class ndarray { ... };
这种模板设计的一个结果是,如果您愿意,还有一个额外的“隐式”模板参数:std::size_t Size,Shape 中所有参数的乘积。我一直在使用 C++17 折叠表达式 ((1 * ... * Shape)),如果它不依赖于 Shape,我通常会使用 Size,但我想知道添加以下“别名”是否会导致编译程序集的任何细微差别:
template<typename T, std::size_t... Shape>
class ndarray {
static constinit std::size_t Size = (1 * ... * Shape);
...
};
有趣的是,ISO C++20 标准没有说明constinit 是否暗示inline,就像它对constexpr 和consteval 所做的那样。我认为constinit 的语义(尤其是与constexpr 变量相关的)只有在变量也是inline 时才真正有意义,但它在标准中的遗漏让我对这个结论保持警惕。
【问题讨论】:
-
为什么要将它设为
constinit变量而不是constexpr?以后打算修改吗? -
@NicolBolas 哇!你的评论让我又看了
constinit,一开始我完全误解了。
标签: c++ language-lawyer c++20