c++ 使用const int作为数组大小

k5ifujac  于 2023-04-13  发布在  其他
关注(0)|答案(5)|浏览(261)

为什么我可以使用本地声明的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
}
j7dteeu8

j7dteeu81#

在编译时应该知道数组的大小。
const int与局部变量可能也不工作,如果值在编译时不知道:

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

在这两种情况下,const int告诉我们值不会改变,而不是在编译时就知道了。

dy1byipe

dy1byipe2#

f2中,常量dim在编译时是已知的,而在f1中则不是。
由于C++没有variable-length arrays,因此在编译时必须知道数组的维数。
使用const作为函数参数更多的是给编译器一个提示,即函数不会修改参数,允许编译器根据该信息进行优化。

brvekthn

brvekthn3#

你对const关键字的理解是错误的。const意味着在特定的上下文范围内变量不会改变,而不是变量在编译时确定。

ztyzrc3y

ztyzrc3y4#

1.数组大小在编译时已知。

  1. 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

p1tboqfb

p1tboqfb5#

从C++11开始,你可以使用constexpr,它会做你所期望的事情。constexpr说编译器除了变量const之外,它的值可以在编译时计算。

相关问题