C ++ const int在常量表达式

时间:2017-11-06 14:28:04

标签: c++ c++11 constexpr

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

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

// 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

2 个答案:

答案 0 :(得分:3)

如果您需要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

答案 1 :(得分:0)

正如nwpGianPaolo对原始问题的评论中所指出的,可能的解决方案是避免使用std::array,并使用允许动态内存分配的容器类型相反,像std::vector