为什么我不能在函数中使用constexpr值,但我可以在此值的范围内执行相同的操作?

时间:2016-08-13 20:39:52

标签: c++ c++11 c++14 constexpr compile-time

我不能在函数中使用constexpr值,而不是函数外部。

  • 我可以在定义auto ar1 = std::array<int, il.size()>();的范围内使用il

  • 但我无法在{ return std::array<T, il.size()>();}中使用constexpr - 函数il_to_array()

为什么我不能在函数中使用constexpr值,但我可以在此值的块范围内执行相同的操作?

https://data.gov.in/api/datastore/resource.json?resource_id=6176ee09-3d56-4a3b-8115-21841576b2f6&api-key=

#include <iostream>
#include <initializer_list>
#include <array>

constexpr size_t size_to_size(size_t v) { return v; }   // 1 - OK

template<typename T>
constexpr size_t il_to_size(std::initializer_list<T> il) { return il.size(); }  // 2 - OK

// 3 - error
template<typename T>
constexpr auto il_to_array(std::initializer_list<T> il) {return std::array<T, il.size()>();}

template<size_t N>
void print_constexpr() { std::cout << N << std::endl; }

int main() {

    constexpr std::initializer_list<int> il = { 1, 2, 3 };
    print_constexpr<il.size()>();   // 0 - OK

    print_constexpr< size_to_size(il.size()) >();   // 1 - OK

    print_constexpr< il_to_size(il) >();    // 2 - OK

    auto ar1 = std::array<int, il.size()>();    // OK - body of function: il_to_array()

    //auto ar2 = il_to_array(il);   // 3 - error

    return 0;
}

例如,我们看到,template-constexpr-function不会失败,即使它可能是或可能不是constexpr - 取决于T,因为其中一个实例可能是constexprhttp://ideone.com/5g0iRE

0 个答案:

没有答案