首页 > 解决方案 > 静态数组上的 const_cast 以添加 constness

问题描述

我面临需要将非常量静态数组传递给 const 参数。正如我发现的那样, const_cast 不仅可以用于删除,还可以用于为类型添加 constness。所以这是我正在尝试做的过度简化的版本:

int a[3] = { 1, 2, 3 };
const int b[3] = const_cast<const int[3]&>( a );

然而,编译器似乎无法解析这个错误,比如

5:43: error: expected '>' before '&' token
5:43: error: expected '(' before '&' token
5:44: error: expected primary-expression before '>' token
5:50: error: expected ')' before ';' token

我也尝试过使用指针进行转换,但遇到了同样的错误。此外,我不想切换到指针,因为它需要更新相当大的代码块。

这似乎是一项相对容易的任务,但我已经坚持了一段时间,甚至无法找到与该主题相关的任何有用信息。

升级版:

感谢评论,我发现在我的案例中根本原因与 const_cast 无关。如果有人感兴趣,我试图用不同大小的静态数组列表初始化向量,这显然是不可能的。

但是,由于是引用数组的不明显语法导致我提出问题,因此我将接受解释它的答案。

标签: c++arrayscastingreferenceconstants

解决方案


首先,您引用数组的语法是错误的。正确的形式是const int (&)[3]。其次,一个数组不能从另一个数组初始化。第三,通常没有必要将非 const 转换为 const,因为这种转换是隐式的。

制作数组的 const 副本的最简单方法是使用数组的包装类。标准库为此类包装器提供了一个模板:std::array. 例子:

std::array a { 1, 2, 3 };
const std::array b = a;

推荐阅读