为什么我能够使用本地声明的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
}
答案 0 :(得分:5)
在编译时应该知道数组大小。
如果在编译时未知该值,则带有局部变量的 const int
可能也不起作用:
void f2(){
const int dim = bar();
int nums[dim]; // error
}
在这两种情况下,const int
都表示值不会发生变化,而不是在编译时就知道了。
答案 1 :(得分:1)
在f2
中,常量dim
在编译时已知,f1
中没有。{/ p>
由于C ++没有variable-length arrays,因此必须在编译时知道数组的维数。
对函数参数使用const
更多的是提示编译器函数不会修改参数,允许编译器根据该信息进行优化。
答案 2 :(得分:1)
您对const
关键字的理解是错误的。 const
意味着在某个上下文范围内变量不会改变,而不是在编译时确定变量。
答案 3 :(得分:1)
从c ++ 11开始,虽然你可以使用constexpr
来做你期望的事情。 constexpr
表示编译器可以在编译时评估变量const
的值。请参阅:http://en.cppreference.com/w/cpp/language/constexpr
答案 4 :(得分: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;
}
然后在getDim
内拨打f1
。
void f1(){
int dim = getDim(...); //// computed at compile time
int nums[dim];
}
请注意,使用constexpr
取决于您的应用程序。进一步参考this。