数组需要常量来初始化大小。因此,int iarr[10]
我以为我可能会使用非const参数并将其转换为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?
编辑:我不知道为什么我无法使用非const初始化数组。我问的是如何从非const函数参数初始化数组。因此,initialize-array-size-from-another-array-value不是我要问的问题。我已经知道我不能这样做,但可能有一种方法和答案在下面提供。
答案 0 :(得分:1)
std::array
是一个不可调整大小的容器,其大小在编译时是已知的。
如果您在编译时知道您的尺寸值,则可以将该值作为non-type template argument传递:
template <int Size>
int run()
{
std::array<int, Size> arr;
}
可以按如下方式使用:
run<5>();
请注意,Size
必须是constant expression。
如果您在编译时不知道自己的尺寸,请使用std::vector
代替std::array
:
int run(int size)
{
std::vector<int> arr;
arr.resize(size); // or `reserve`, depending on your needs
}
std::vector
是一个可以在运行时调整大小的连续容器。
答案 1 :(得分:0)
我在问如何从非const函数参数初始化数组。
如您所见,无法使用变量初始化数组大小,因为您需要在编译时指定大小或数组。
要解决您的问题,您应该使用与数组类似的std::vector
,但您可以在运行时调整它的大小。您可以使用运算符[]
处理de vector,就像处理数组一样,例如:
class MyClass
{
vector<char> myVector;
public:
MyClass();
void resizeMyArray(int newSize);
char getCharAt(int index);
};
MyClass::MyClass():
myVector(0) //initialize the vector to elements
{
}
void MyClass::resizeMyArray(int newSize)
{
myVector.clear();
myVector.resize(newSize, 0x00);
}
char MyClass::getCharAt(int index)
{
return myVector[index];
}
有关详细信息,请访问以下链接:http://www.cplusplus.com/reference/vector/vector/
升级:另外,考虑到std::array
无法调整大小,正如links所说:
数组是固定大小的序列容器:它们包含以严格线性顺序排列的特定数量的元素。