【问题标题】:Using const int as array size使用 const int 作为数组大小
【发布时间】:2015-05-27 07:49:01
【问题描述】:

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

【问题讨论】:

  • wt 是你的编译器吗?
  • @ANjaNA VS2013。即版本 18

标签: c++ arrays constants


【解决方案1】:

在编译时应该知道数组大小。

const int 如果在编译时不知道该值,则带有局部变量的 const int 可能也不起作用:

void f2(){
  const int dim = bar();
  int nums[dim];  // error
}

在这两种情况下,const int 表示值不会改变,而不是在编译时已知。

【讨论】:

    【解决方案2】:

    f2 中,常量dim 在编译时是已知的,而在f1 中则不是。

    由于 C++ 没有variable-length arrays,因此必须在编译时知道数组的维度。

    const 用于函数参数更多地是向编译器暗示该函数不会修改参数,从而允许编译器例如根据该信息进行优化。

    【讨论】:

      【解决方案3】:

      您对const 关键字的理解是错误的。 const 暗示在一定的上下文范围内变量不会改变,并不是说变量是在编译时确定的。

      【讨论】:

        【解决方案4】:

        从 c++11 开始,虽然您可以使用 constexpr,但它会达到您的预期。 constexpr 表示编译器除了变量是 const 之外,它的值可以在编译时评估。见:http://en.cppreference.com/w/cpp/language/constexpr

        【讨论】:

          【解决方案5】:
          1. 在编译时应该知道数组大小。
          2. 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

          【讨论】:

            猜你喜欢
            • 2016-05-02
            • 1970-01-01
            • 1970-01-01
            • 2012-07-22
            • 2021-11-29
            • 2012-03-24
            • 2019-05-16
            • 1970-01-01
            相关资源
            最近更新 更多