const_cast静态数组以添加恒常性

const_cast on a static array to add constness

本文关键字:添加 常性 数组 cast 静态 const      更新时间:2023-10-16

我遇到了将非常量静态数组传递给常量参数的需要。正如我所发现的,const_cast不仅可以用于删除,还可以用于为类型添加恒定性。所以这是我正在尝试做的事情的过度简化版本:

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无关。如果有人感兴趣,我正在尝试使用不同大小的静态数组列表初始化矢量,这显然是不可能的。

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

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

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

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

这不是引用数组的语法。它的拼写是这样的:

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

但是无法复制您的阵列。您必须引用它或使用std::array

int a[3] = {1, 2, 3};
auto& b = const_cast<const int(&)[3]>(a);
// or use std::array
std::array a = {1, 2, 3};
auto const b = a;