我可以将非const函数参数转换为const并设置数组的大小吗?

时间:2017-10-16 15:29:48

标签: c++11 const

数组需要常量来初始化大小。因此,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不是我要问的问题。我已经知道我不能这样做,但可能有一种方法和答案在下面提供。

2 个答案:

答案 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所说:

  

数组是固定大小的序列容器:它们包含以严格线性顺序排列的特定数量的元素。