【发布时间】:2018-03-28 04:25:04
【问题描述】:
数组需要一个常量来初始化大小。因此,int iarr[10]
我认为我可以采用非常量参数并将其转换为 const,然后将其用于数组大小
int run(int const& size);
int run(int const& size)
{
const int csize = size;
constexpr int cesize = csize;
std::array<int, cesize> arr;
}
不幸的是,这不起作用,我想使用const_cast作为
int run(int& size);
int run(int& size)
{
const int val = const_cast<int&>(size);
constexpr int cesize = val;
std::array<int, cesize> arr;
}
这也行不通。我已经阅读了一些 SO 帖子,看看我是否能找到任何东西
cannot-convert-argument-from-int-to-const-int
c-function-pass-non-const-argument-to-const-reference-parameter
what-does-a-const-cast-do-differently
当用作数组大小的初始值设定项时,有没有办法确保参数为 const?
编辑:我不是在问为什么我不能用非常量初始化一个数组。我在问如何从非常量函数参数初始化数组。因此,initialize-array-size-from-another-array-value 不是我要问的问题。我已经知道我不能这样做,但是下面可能提供了一种方法和答案。
【问题讨论】:
-
@JimmyB 该问题的 OP 真的 需要切换已接受的答案,尽管它并不直接适用于 OP 的示例
-
看起来您正在尝试创建一个可变长度数组(这是一种具有各种缺点的高级 C 功能,但实际上在 C++ 中并不支持)。由于大小来自一个参数(并且您的函数不是
constexpr),它的值只会在运行时知道。创建固定大小的数组需要在编译时知道大小,以便实例化正确的模板(或者通常分配正确的内存量)。 -
思想实验:如果允许您刚刚展示的内容,为什么不直接放弃大小必须是常量的整个要求,因为解决方法只是将值分配给常量?
-
@Rakete1111 如果我被允许传递一个非常量参数来初始化一个数组或
std::array这个问题本身甚至都不存在。