为什么我可以使用本地声明的const int作为数组声明的大小,但不允许将const int作为参数传递?例如,在下面的代码中,为什么我只在第2行得到编译器错误?
const int
void f1(const int dim){ int nums[dim]; // line 2: errors } void f2(){ const int dim = 5; int nums[dim]; // ok }
j7dteeu81#
在编译时应该知道数组的大小。const int与局部变量可能也不工作,如果值在编译时不知道:
void f2(){ const int dim = bar(); int nums[dim]; // error }
在这两种情况下,const int告诉我们值不会改变,而不是在编译时就知道了。
dy1byipe2#
在f2中,常量dim在编译时是已知的,而在f1中则不是。由于C++没有variable-length arrays,因此在编译时必须知道数组的维数。使用const作为函数参数更多的是给编译器一个提示,即函数不会修改参数,允许编译器根据该信息进行优化。
f2
dim
f1
const
brvekthn3#
你对const关键字的理解是错误的。const意味着在特定的上下文范围内变量不会改变,而不是变量在编译时确定。
ztyzrc3y4#
1.数组大小在编译时已知。
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
constexpr int getDim(......) { ....... ....... return dim; }
然后在f1内部调用getDim。
getDim
void f1(){ int dim = getDim(...); //// computed at compile time int nums[dim]; }
请注意,constexpr的使用取决于您的应用程序。进一步参考this。
p1tboqfb5#
从C++11开始,你可以使用constexpr,它会做你所期望的事情。constexpr说编译器除了变量const之外,它的值可以在编译时计算。
5条答案
按热度按时间j7dteeu81#
在编译时应该知道数组的大小。
const int
与局部变量可能也不工作,如果值在编译时不知道:在这两种情况下,
const int
告诉我们值不会改变,而不是在编译时就知道了。dy1byipe2#
在
f2
中,常量dim
在编译时是已知的,而在f1
中则不是。由于C++没有variable-length arrays,因此在编译时必须知道数组的维数。
使用
const
作为函数参数更多的是给编译器一个提示,即函数不会修改参数,允许编译器根据该信息进行优化。brvekthn3#
你对
const
关键字的理解是错误的。const
意味着在特定的上下文范围内变量不会改变,而不是变量在编译时确定。ztyzrc3y4#
1.数组大小在编译时已知。
const
表示值不变。所以,这是关于'dim'在编译时的值。
在第一种情况下,它是未知的。编译器在编译时不知道
dim
的值。它取决于传递给函数的值。在这种情况下,
dim
的值在编译时是已知的,所以没有问题。你可以使用C++ 11中的一个特性来实现这一点。
将函数定义为
constexpr
。然后在
f1
内部调用getDim
。请注意,
constexpr
的使用取决于您的应用程序。进一步参考this。p1tboqfb5#
从C++11开始,你可以使用
constexpr
,它会做你所期望的事情。constexpr
说编译器除了变量const
之外,它的值可以在编译时计算。