为什么我可以使用本地声明的
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
可能不起作用:
void f2(){
const int dim = bar();
int nums[dim]; // error
}
在这两种情况下,
const int
表示该值不会改变,而不是在编译时已知。
在
f2
中,常量 dim
在编译时是已知的,而在 f1
中则不是。
由于 C++ 没有可变长度数组,数组的维度必须在编译时已知。
对函数参数使用
const
更多的是向编译器暗示该函数不会修改参数,从而允许编译器根据该信息进行优化。
您对
const
关键字的理解是错误的。 const
意味着在一定的上下文范围内变量不会改变,而不是变量在编译时确定。
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
的使用取决于您的应用程序。进一步参考这个。