我不能在函数中使用constexpr值,而不是函数外部。
我可以在定义auto ar1 = std::array<int, il.size()>();
的范围内使用il
。
但我无法在{ return std::array<T, il.size()>();}
中使用constexpr
- 函数il_to_array()
为什么我不能在函数中使用constexpr值,但我可以在此值的块范围内执行相同的操作?
#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
:http://ideone.com/5g0iRE
可以得出结论,如果这是一个模板函数,它可能是以下任何一个的专门化:constexpr
和非 - constexpr
。
并且基于Why does the C++ compiler makes it possible to declare a function as constexpr, which can not be constexpr? - 如果我们只使用constexpr
- 参数然后仅实例化constexpr
- 实例,那么非{{1}并不重要无法实例化函数。