c++ - 常量数组

标签 c++ arrays templates constants

这是一个不错的旧 C 数组:

int a[10];

这是一个很好的旧 C 数组,它是 const:

const int b[10];

在 C++ 中,似乎有两种方法可以定义 std::arrayconst:

std::array<const int, 10> c;
const std::array<int, 10> d;

这两个定义是等价的吗?如果是这样,惯用语是什么?如果不是,有什么区别?

最佳答案

好吧,原来的 const int b[10]; 仅在您可以初始化数组时才有用,因此两个 std::array 示例都没有在实践中工作。

1:

std::array<const int, 10> c;

这是最接近 const int c[10];。问题是它没有默认构造函数,并且因为元素不是可变的,所以使用它毫无值(value)。您必须在构造函数中为其提供一些初始化。照原样,它会给出一个编译器错误,因为默认构造函数没有初始化元素。

这段代码意味着 c 是可变的,但元素本身不是。然而,在实践中,c 上没有不影响元素的突变。

2:

const std::array<int, 10> d;

这意味着 d 是不可变的,但元素是可变类型 int。因为 const 将传播给成员,这意味着调用者仍然不能改变元素。与上面的示例类似,您需要初始化 d,因为它是 const

实际上,它们在可变性方面的行为相似,因为array上的可变操作总是接触元素。

关于c++ - 常量数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7791170/

相关文章:

java - 我将如何完成这段java代码?

templates - 完美转发模板参数包到emplace_back - 编译失败

c++ - 接受 0 个参数并返回类型可转换为 int 的未知类方法回调

c++ - 模板类作为模板类参数

c++ - 你能用 C++ 做一个计算 goto 吗?

C++ 内存泄漏与 unordered_map

java - 逐行从文本中读取 int

javascript - 从数组中删除已删除的值

const 和非 const 容器的 C++ 自定义迭代器

c++ - exe导入dll序号与DLL导出函数名比较?