【发布时间】:2016-12-20 13:55:34
【问题描述】:
我不能在函数中使用 constexpr 值,而不是在函数之外。
我可以在定义了
il的范围内使用auto ar1 = std::array<int, il.size()>();。但是我不能在
constexpr-functionil_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:Why does the C++ compiler makes it possible to declare a function as constexpr, which can not be constexpr?
并且可以得出结论,如果这是一个模板函数,它可能是以下任一特化:
constexpr和非constexpr。并且在SFINAE的基础上——如果我们只使用
constexpr-arguments那么只实例化constexpr-instance,非constexpr-function不能实例化也没关系.
【问题讨论】:
标签: c++ c++11 c++14 constexpr compile-time