c++ - 为什么类静态 constexpr 值不能依赖于类静态 constexpr 函数?
问题描述
任何人都知道以下是否有问题或是否是错误?
#include <utility>
struct X {
template <typename...Ts>
static constexpr std::size_t fn() {
return 1;
}
static constexpr std::size_t value = fn();
};
看起来 msvc 19.22 似乎没问题,但 clang 和 gcc 不喜欢它。
如果我将 fn() 模板移到结构外部,它可以正常工作。铿锵声 说:
error: constexpr variable 'value' must be initialized by a constant expression
和 gcc 说:
static constexpr std::size_t X::fn() [with Ts = {}; std::size_t = long unsigned int]' used before its definition
另外,以后不能定义:
struct X {
template <typename...Ts>
static constexpr std::size_t fn() {
return 1;
}
static constexpr std::size_t value;
};
constexpr std::size_t X::value = X::fn();
但是,它可以指定为 constexpr 函数:
struct X {
template <typename...Ts>
static constexpr std::size_t fn() {
return 1;
}
static constexpr std::size_t value() {
return fn();
}
};
这似乎是由于该类在使用时不完整引起的。如果是这样,这似乎是一个缺陷,因为静态成员 vars/fns 不依赖于类。
编辑
谢谢@Rakete1111。查看您提供的副本,我从标准中得到了这个引用(强调我的):
9.4.2 [class.static.data] p3: ... 文字类型的静态数据成员可以在类定义中使用 constexpr 说明符声明;如果是这样,它的声明应指定一个大括号或等式初始化器,其中作为赋值表达式的每个初始化器子句都是一个常量表达式。
as can与must不同,这进一步表明了我的第二个示例应该起作用的缺陷。
解决方案
推荐阅读
- javascript - 我收到一个错误,因为 Uncought 语法错误:标识符“i”已在我的 js 代码中声明
- angular - Ngx Bootstrap 下拉菜单无法在 ag 网格中显示完整列表
- linux - 在 vim 缩写中定义 linux 命令
- javascript - 无法更改源自 Android 原生基础的选取器元素的字体大小和字体粗细
- amazon-cloudformation - 如何在从控制台构建的现有服务上执行基础架构代码?
- python - 从 n m 列数据帧创建 m n 列数据帧
- r - 如何重新排列R中的列元素?
- java - 升级到 react-native 版本 0.60.4 后 react-native run-android 出错
- python - 在按钮单击时将线添加到 Plotly Scattermapbox
- kotlin - 如何在 okhttp 4 中使用新的扩展功能