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

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

本文关键字:作用域 函数 不能 为什么 constexpr 我可以      更新时间:2023-10-16

不能在函数内使用constexpr value,而不能在函数外使用。

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

  • 但是我不能使用{ return std::array<T, il.size()>();}constexpr -function il_to_array()

为什么我不能在函数中使用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:为什么c++编译器可以声明一个不能是constexpr的函数为constexpr?

  • 可以得出结论,如果这是一个模板函数,它可能是专门化constexpr和非constexpr中的任何一个。

  • 在SFINAE的基础上,如果我们只使用constexpr -参数,那么只实例化constexpr -instance,非constexpr -function不能实例化也没关系。

(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()>();}

即使函数只使用编译时已知的参数调用,