使用const int作为数组大小

时间:2015-05-27 07:49:01

标签: c++ arrays const

为什么我能够使用本地声明的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
}

5 个答案:

答案 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)

  1. 应在编译时知道数组大小。
  2. const表示该值不会更改。
  3. 所以,这是关于编译时'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

相关问题