在数组声明中使用常量结构成员
Using constant struct members in array declaration
我正在编写一个小玩具项目(一个数据结构),其中我有一个常量集合,我想将其捆绑在主类中的匿名结构中。这个类使用一些常量来声明静态数组的大小。它看起来像这样:
template< class T, size_t K >
class Tree {
static struct {
size_t const min_keys{ K };
size_t const max_keys{ 2*K };
...
} const constants;
...
};
K
是模板形参,该结构体的所有成员都是const。然而,当声明一个静态数组时,编译器(我使用的是g++ 5.1)会报错。
bpt.h:34:34: error: size of array is not an integral constant-expression
T keys[constants.max_keys];
这使我困惑-一切都是const
。我只是试图清理我的常量,像这样捆绑它们似乎是理想和有趣的。使用枚举类也不错,但由于该类还需要与那些常量进行比较,因此不可能使用枚举类。现在我正在使用一个匿名枚举,它确实可以工作,但是这激起了我的好奇心。
为什么会这样?这是个坏主意吗?
下面的代码可以工作:
#include <cstddef>
#include <iostream>
template <typename T, std::size_t K>
struct Tree {
static constexpr struct {
// ^^^^^^^^^
std::size_t const min_keys{ K };
std::size_t const max_keys{ 2*K };
} constants {};
// ^^^
};
使用例子:
int main()
{
int foo[Tree<int, 20>::constants.min_keys] = {1, 2};
}
关键是使Tree::constants
成为constexpr
静态数据成员,这意味着它的成员是常量表达式,可以用作数组大小。注意:
static constexpr成员需要初始化式,因此
{}
(或者我们可以把{K, 2 * K}
放在这里,不使用大括号或等号初始化式)。你不需要一个静态constexpr成员的定义,只要你不过度使用它(例如,不要试图计算
&Tree<int, 3>::constants
)。
相关文章:
- 为什么"具有常量成员的结构"类型的指针不能指向"具有非常量成员的结构"?
- 调用 cout 时如何在结构中输出常量文本?
- 返回对常量结构(指针类型)成员的引用:明显的左值到右值转换
- 将结构C++成员从非常量转换为常量
- 列出常量和数组结构字段的初始化
- 如何初始化具有常量变量的结构数组
- 常量结构的指针成员
- 如何在C++中声明静态常量结构
- C++常量结构成员初始化
- 命名空间中常量结构、类和数组的初始化
- C++ 更改常量结构的成员值
- 从 C 到 C++ 的常量结构中 char 数组的静态初始化
- 为什么可以在常量结构上调用非常量成员函数
- 正在将常量结构引用转换为非常量指针
- Volatile关键字允许访问UnitTest++中的常量结构
- 类内部的C++常量结构初始化
- c++常量结构初始化
- 在数组声明中使用常量结构成员
- 为什么常量结构数组在按名称引用常量结构时不放在 .rodata 中?
- 在哪里声明常量结构数组