什么时候可以使用const int作为数组的大小?

问题描述 投票:0回答:5

为什么我可以使用本地声明的

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
}
c++ arrays constants constant-expression
5个回答
8
投票

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

如果在编译时未知该值,则具有局部变量的

const int
可能不起作用:

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

在这两种情况下,

const int
表示该值不会改变,而不是在编译时已知。


2
投票

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

由于 C++ 没有可变长度数组,数组的维度必须在编译时已知。

对函数参数使用

const
更多的是向编译器暗示该函数不会修改参数,从而允许编译器根据该信息进行优化。


1
投票

您对

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


1
投票
  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;
}

然后在

getDim
内拨打
f1

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

请注意,

constexpr
的使用取决于您的应用程序。进一步参考这个


0
投票

从 C++11 开始,您可以使用

constexpr
来实现您的预期。
constexpr
表示编译器除了变量之外,
const
它的值可以在编译时评估。

© www.soinside.com 2019 - 2024. All rights reserved.