c++ - 静态 constinit 成员变量是否与非类型模板参数相同?
问题描述
我有一个 N 维数组的类模板:
template<typename T, std::size_t... Shape>
class ndarray { ... };
这种模板设计的一个结果是,如果您愿意,还有一个额外的“隐式”模板参数:std::size_t Size
,所有参数的乘积Shape
。我一直在使用 C++17 折叠表达式 ( ),如果它不依赖于,(1 * ... * Shape)
我通常会使用它,但我想知道添加以下“别名”是否会导致编译程序集出现任何细微差异:Size
Shape
template<typename T, std::size_t... Shape>
class ndarray {
static constinit std::size_t Size = (1 * ... * Shape);
...
};
有趣的是,ISO C++20 标准并没有说明它是否constinit
暗示和. 我认为(尤其是与变量相关的)的语义只有在变量 were also 时才真正有意义,但它从标准中省略让我对这个结论持谨慎态度。inline
constexpr
consteval
constinit
constexpr
inline
解决方案
constinit
只有一个语义:用于初始化变量的表达式必须是常量表达式。
而已。这就是它所做的一切:如果初始化表达式不是有效的常量表达式,它会导致编译错误。在所有其他方面,这样的变量与没有变量相同constinit
。事实上,该提案的早期版本将 constinit 作为属性而不是关键字,因为它实际上并没有做任何事情。它仅对变量的无效初始化给出了编译错误。
对于这种情况,没有理由不制作变量constexpr
。您显然不打算更改变量,因此使变量可修改是没有意义的。
推荐阅读
- javascript - 在 forEach 循环后显示 HTML 时出现问题
- c# - 使用 SQL 数据库在 Azure 门户上部署 ASP.NET MVC 应用程序
- perforce - 在 Perforce 中,如何将普通用户更改为超级用户?
- python - 对已关闭文件的 I/O 操作。与熊猫
- php - 如何将 Symfony HttpClient 模拟为依赖项?
- python - Tensor(..., shape=(), dtype=int64) 必须与 Tensor(..., shape=(), dtype=resource) Keras 来自同一个图
- delphi - delphi用TStringList模拟fifo
- angular - 将 NGXS 状态分解为更小的可维护部分,但让它们彼此可访问的最佳方法是什么?
- c - 我在学习编程语言学时不知道的领域寻求帮助
- javascript - 如何使用 jQuery 创建包含 Django 静态 src 的元素