为什么我不能在函数中使用constexpr值,但我可以在这个值的作用域内做同样的事情
Why can not I use constexpr value in function, but I can do the same in scope of this value?
不能在函数内使用constexpr value,而不能在函数外使用。
-
我可以在定义
il
的范围内使用auto ar1 = std::array<int, il.size()>();
-
但是我不能使用
{ return std::array<T, il.size()>();}
在constexpr
-functionil_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()>();}
即使函数只使用编译时已知的参数调用,
相关文章:
- C++quit()函数中可能存在作用域问题
- 全局作用域中函数指针的赋值
- 在类函数中初始化外部作用域变量
- 是同一作用域的函数部分中的函数调用
- 未在此作用域中声明的函数和变量 (C++)
- 在构造函数中输入对象时C++类成员作用域
- 函数未在作用域中声明 / 如何结合使用 header.h、header.cpp 和 main.cpp?
- "变量":函数中函数作用域不允许初始化的自动或寄存器变量'naked'
- 如何从类函数返回指向类作用域数组的指针?
- 局部变量的作用域是块或函数
- 当变量在多个函数作用域中使用时,我应该在类 private 中声明该变量吗?
- 缩短成员函数作用域说明符(嵌套类)(C++)
- 块作用域中的函数指针定义
- 当作用域中出现条件时,如何重置函数中的变量?
- 函数在作用域中定义,但编译器抱怨它超出了作用域
- 在编译时选择全局作用域函数
- 函数和类的作用域有什么区别
- 空的唯一指针在离开作用域时调用析构函数
- 作用域仅限于函数的类变量
- 函数作用域是静态变量还是线程本地变量在C++11中的第一个条目中初始化