C++ const int 在常量表达式中不可用

Posted

技术标签:

【中文标题】C++ const int 在常量表达式中不可用【英文标题】:C++ const int not usable in constant expression 【发布时间】:2017-11-06 14:28:03 【问题描述】:

我正在尝试初始化一个数组,我通过外部函数提供该数组的大小。

外部函数计算向量的大小并将它们成对输出。

// The function has been simplified for the sake of the question
std::pair< int, int> calculate_size ( 
    const double in1,
    const double in2
)

    int temp1   = int(in1/in2);
    int temp2   = int(in2/in1);
    std::pair< int, int> output = make_pair(temp1, temp2);
    return output;

然后,在其他地方,我提取上述函数的输出以使用 tie 生成数组的大小(我正在使用 C++11 进行编译):

// Extract sizes
int tempSize1, tempSize2;
tie(tempSize1, tempSize2) = calculate_size (in1, in2);
const int constSize1 = temp1;  
const int constSize2 = temp2; 

// Initialize vector (compiler error)
std::array<double, constSize1> v1;
std::array<double, constSize2> v2;

编译器给出以下错误:The value of 'constSize1' is not usable in a constant expression

但是,我看不出我做错了什么。根据C++ reference这个网站,他们带来的例子似乎正是我正在做的。

我错过了什么?有没有更好的方法来做到这一点?

编辑:

评论表明constexpr 是我需要的。如果我在不更改其余部分的情况下使用它,错误消息将转移到 constexpr 行,但本质上保持不变:

// Modified to use constexpr
int temp1, temp2;
tie(temp1,temp2) = calculate_samples (in1, in2);
constexpr int constSize1 = temp1;
constexpr int constSize2 = temp2;

错误:The value of 'temp1' is not usable in a constant expression

【问题讨论】:

const 不够用,这里需要constexpr 顺便说一句,std::array 中的第三个参数是什么? 另外,std::array 只有一个非类型模板参数。 非常粗略地说,const 的意思是“在runtime 初始化为任何值后的常量”,constexpr 的意思是“编译器在compile time 知道的值”。您需要后者作为std::array 的模板参数。另请注意,std::array 不支持多维数组,因为您可能正在尝试获取。 要使const int 可以在常量表达式中使用,它本身必须使用常量表达式进行初始化。 【参考方案1】:

如果您需要array(而不是vector),那么将函数标记为constexpr 就可以了。

有关工作代码,请参见下文。这是在 Coliru 上运行的代码:http://coliru.stacked-crooked.com/a/135a906acdb01e08。

#include <iostream>
#include <utility>
#include <array>

constexpr std::pair<int, int> calculate_size (
    const double in1, const double in2) 
  return std::make_pair(
    static_cast<int>(in1 / in2),
    static_cast<int>(in2 / in1));


int main() 
  constexpr auto sizes = calculate_size(4, 2); 

  std::array<double, sizes.first> v1;
  std::array<double, sizes.second> v2;

  std::cout << "[Size] v1: " << v1.size() << " - v2: " << v2.size() << "\n";

哪个打印:[Size] v1: 2 - v2: 0

【讨论】:

【参考方案2】:

正如nwp 和GianPaolo 对原始问题的cmets 所指出的那样,一种可能的解决方案是避免使用std::array,而是使用一种允许动态内存分配的容器,例如std::vector .

【讨论】:

以上是关于C++ const int 在常量表达式中不可用的主要内容,如果未能解决你的问题,请参考以下文章

常量引用

转C++ 常量类型 const 详解

C++关键字const

C++ const 修饰符

C++中强行修改const常量的问题

C++笔记--const(1-4)