【问题标题】:const_cast on a static array to add constness静态数组上的 const_cast 以添加 constness
【发布时间】:2020-05-04 15:00:39
【问题描述】:

我需要将非常量静态数组传递给 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

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

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

更新:

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

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

【问题讨论】:

  • 没有必要这样做。您可以将非const 参数直接传递给const 参数。请显示minimal reproducible example,说明您尝试执行的操作以及遇到的错误。
  • 我宁愿发布你想要传递的函数和参数,但它错过了常量。如果您不需要cosnt_cast,我不会感到惊讶
  • 目前特别不清楚您的意图是制作数组的const 副本,还是打算形成对原始数组的const 引用。请通过提供最初失败的代码演示来澄清。
  • @walnut @foreknownas_463035818 你是对的。我试图准备初始问题的示例,但遇到了另一个与const_cast 无关的错误。您能否建议我是否应该更改此问题或为最初的问题创建另一个问题?
  • @Dheinamar 如果错误与参数的constness 有关,那么我认为添加到这个问题就可以了。如果不是,那么我建议打开一个新问题,因为更改问题的主题会使已经给出的答案无效。在任何一种情况下,请确保您发布完整的minimal reproducible example 及其生成的所有错误消息,以及您最初打算做什么的解释。也不要覆盖当前问题中的代码和错误消息,因为这也会使答案无效。

标签: c++ arrays casting reference constants


【解决方案1】:

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

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

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

【讨论】:

  • 如果有的话,我认为 OP 更有可能在寻找 std::as_const 而不是制作 const 副本。 (尽管我更倾向于认为这是一个 XY 问题。)
  • @walnut 也许。根据这个问题,我无法猜测。对我来说,代码示例看起来像是在尝试制作 const 副本。
【解决方案2】:

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

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;

【讨论】:

  • 使用const auto&amp; b = a 作为参考更简单。
猜你喜欢
  • 1970-01-01
  • 2011-10-22
  • 1970-01-01
  • 1970-01-01
  • 2020-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多