使用 const int 作为数组大小

Using const int as array size

为什么我可以使用本地声明的 const int 作为数组声明的大小,但不允许对作为参数传递的 const int 做同样的事情?

例如,在下面的代码中,为什么我只在第 2 行遇到编译器错误?

void f1(const int dim){
  int nums[dim];  // line 2: errors
}

void f2(){
  const int dim = 5;
  int nums[dim];  // ok
}

数组大小应该在编译时已知。

const int 如果在编译时不知道该值,则带有局部变量的

const int 可能不起作用:

void f2(){
  const int dim = bar();
  int nums[dim];  // error
}

在这两种情况下,const int 表明该值不会改变,而不是在编译时已知。

f2 中常量 dim 在编译时是已知的,在 f1 中不是。

并且由于 C++ 没有 variable-length arrays 数组的维度必须在编译时已知。

对函数参数使用const更多的是向编译器提示函数不会修改参数,例如允许编译器根据该信息进行优化。

您对const关键字的理解有误。 const 表示在一定的上下文范围内变量不会改变,并不是说变量是在编译时确定的。

从 c++11 开始,尽管您可以使用 constexpr 来满足您的期望。 constexpr 表示编译器除了变量 const 之外,它的值可以在编译时求值。参见:http://en.cppreference.com/w/cpp/language/constexpr

  1. 数组大小应该在编译时已知。
  2. const表示值不变。

所以,这是编译时 'dim` 的值。

第一种情况未知。编译器在编译时不知道 dim 的值。这取决于传递给函数的值。

void f1(const int dim){
  int nums[dim];  // line 2: errors
}

在这种情况下,dim 值在编译时已知,因此没有问题。

void f2(){
  const int dim = 5;
  int nums[dim];  // ok
}

您可以为此使用 c++ 11 中的功能。

将您的函数定义为 constexpr

constexpr int getDim(......)
{
    .......
    .......
    return dim;
}

然后在 f1.

中调用 getDim
void f1(){
  int dim = getDim(...); //// computed at compile time
  int nums[dim];
}

请注意,constexpr 的使用取决于您的应用程序。进一步参考 this.