使用 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
- 数组大小应该在编译时已知。
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.
为什么我可以使用本地声明的 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
- 数组大小应该在编译时已知。
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.