C++ constexpr类型说明符
2016-03-12 11:25
363 查看
本系列文章由 @yhl_leo 出品,转载请注明出处。
文章链接: /article/3715962.html
关键字
1
一般来说,如果你认定变量是一个常量表达式,那就把它声明成为
2
与
与其它常量指针类似,
文章链接: /article/3715962.html
关键字
constexpr于 C++11 中引入并于 C++14 中得到改善。它表示常数表达式。与
const相同,它可应用于变量,因此如果任何代码试图修改该值,均将引发编译器错误。与
const不同,
constexpr也可应用于函数和类构造函数。
constexpr指示值或返回值是常数,并且如果可能,将在编译时计算值或返回值。
1 constexpr
变量
const和
constexpr变量之间的主要区别在于:
const变量的初始化可以延迟到运行时,而
constexpr变量必须在编译时进行初始化。所有
constexpr变量均为常量,因此必须使用常量表达式初始化。
[code]constexpr float x = 42.0; constexpr float y{108}; constexpr float z = exp(5, 3); constexpr int i; // Error! Not initialized int j = 0; constexpr int k = j + 1; //Error! j not a constant expression
一般来说,如果你认定变量是一个常量表达式,那就把它声明成为
constexpr类型。
2 constexpr
函数
constexpr函数是在使用需要它的代码时,可以在编译时计算其返回值的函数。当其参数为
constexpr值并且在编译时使用代码需要返回值时(例如,初始化一个
constexpr变量或提供一个非类型模板参数),它会生成编译时常量。使用非
constexpr参数调用时,或编译时不需要其值时,它将与正则函数一样,在运行时生成一个值。
[code]#include <iostream> using namespace std; // Pass by value constexpr float exp(float x, int n) { return n == 0 ? 1 : n % 2 == 0 ? exp(x * x, n / 2) : exp(x * x, (n - 1) / 2) * x; }; // Pass by reference constexpr float exp2(const float& x, const int& n) { return n == 0 ? 1 : n % 2 == 0 ? exp2(x * x, n / 2) : exp2(x * x, (n - 1) / 2) * x; }; // Compile time computation of array length template<typename T, int N> constexpr int length(const T(&ary) ) { return N; } // Recursive constexpr function constexpr int fac(int n) { return n == 1 ? 1 : n*fac(n - 1); } // User-defined type class Foo { public: constexpr explicit Foo(int i) : _i(i) {} constexpr int GetValue() { return _i; } private: int _i; }; int main() { // foo is const: constexpr Foo foo(5); // foo = Foo(6); // Error! //Compile time: constexpr float x = exp(5, 3); // const float a = 2.0; // const int b = 2; // constexpr float xx = exp2(a, b); // Error! constexpr float xx = exp2(2.0, 2); constexpr float y{ exp(2, 5) }; constexpr int val = foo.GetValue(); constexpr int f5 = fac(5); const int nums[]{ 1, 2, 3, 4 }; const int nums2[length(nums) * 2]{ 1, 2, 3, 4, 5, 6, 7, 8 }; cout << "The value of foo is " << foo.GetValue() << endl; }
3 constexpr和指针
还记得const与指针的规则吗?如果关键字
const出现在星号左边,表示被指物是常量;如果出现在星号右边,表示指针本身是常量;如果出现在星号两边,表示被指物和指针两者都是常量。
与
const不同,在
constexpr声明中如果定义了一个指针,限定符
constexpr仅对指针有效,与指针所指对象无关。
[code]const int *p = 0; // non-const pointer, const data constexpr int *q = 0; // const pointer, non-const data
与其它常量指针类似,
const指针既可以指向常量也可以指向一个非常量:
[code]int j = 0; constexpr int i = 2; constexpr const int *p = &i; // const pointer, const data constexpr int *p1 = &j; // const pointer, non-const data
相关文章推荐
- 关于C++中友元的理解和应用
- c++中引用和指针的区别
- c++中的模板
- C语言终极面试及答案分析
- C++拷贝构造函数与赋值函数的异同
- 《More Effective C++》Rule7:千万不要重载 &&, ||, 和 ,操作符
- 二进制中1的个数
- C语言堆内存管理上出现的问题,内存泄露,野指针使用,非法释放指针
- 学习C++之类与对象
- C++中的main函数
- C语言-数组
- C语言—指针数组
- C/C++函数指针(typedef简化定义)
- 大数相关计算(c语言版)
- C语言实现希尔排序
- C语言中动态申请连续的二维数组
- 归并排序 C++实现
- C++构造函数详解及显式调用构造函数
- 小白第一次学C语言
- 孙敬哲的C++上机实验1-2