为什么我不能在函数中使用 constexpr 值,但我可以在这个值的范围内做同样的事情?
Why can not I use constexpr value in function, but I can do the same in scope of this value?
我不能在函数中使用 constexpr 值,而不是在函数外部。
我可以在定义了 il
的范围内使用 auto ar1 = std::array<int, il.size()>();
。
但是我不能在constexpr
-函数il_to_array()
中使用{ return std::array<T, il.size()>();}
为什么我不能在函数中使用 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
:
并且可以得出结论,如果这是一个模板函数,它可能是 constexpr
和非 constexpr
中的任何一个特化。
并且在SFINAE的基础上——如果我们只使用constexpr
-arguments然后只实例化constexpr
-instance,并且非-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()>();}
即使仅使用编译时已知的参数调用函数也是如此。
我不能在函数中使用 constexpr 值,而不是在函数外部。
我可以在定义了
il
的范围内使用auto ar1 = std::array<int, il.size()>();
。但是我不能在
constexpr
-函数il_to_array()
中使用
{ return std::array<T, il.size()>();}
为什么我不能在函数中使用 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
:
并且可以得出结论,如果这是一个模板函数,它可能是
constexpr
和非constexpr
中的任何一个特化。并且在SFINAE的基础上——如果我们只使用
constexpr
-arguments然后只实例化constexpr
-instance,并且非-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()>();}
即使仅使用编译时已知的参数调用函数也是如此。