为什么我不能在函数中使用 constexpr 值,但我可以在这个值的范围内做同样的事情?

Why can not I use constexpr value in function, but I can do the same in scope of this value?

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

为什么我不能在函数中使用 constexpr 值,但我可以在这个值的块范围内做同样的事情?

http://ideone.com/5g0iRE

#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,因为实例之一可能是 constexpr:

(constexpr) 函数的参数不是 constexpr

constexpr 函数可能会被赋予编译时未知的参数。

因此无论 v 在编译时是否已知,下面的内容都是有效的

constexpr size_t size_to_size(size_t v) { return v; }

但是以下函数不起作用,因为 il 不是 constexpr 并且非类型模板参数需要在编译时知道:

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

即使仅使用编译时已知的参数调用函数也是如此。