c++11新特性----constexpr (编译时常量)

来源:互联网 发布:建信优化成长基金净值 编辑:程序博客网 时间:2024/05/18 08:11

常量表达式的值需要在编译时确定。只有字面值类型(Literal type)能被定义为constexpr。

尽管指针和引用能把定义成constexpr,但他们的初始化值要求很严。一个constexpr指针的初始值必须是nullptr/0或者是存储于某个固定地址中的对象。

函数体内定义的变量,一般来说没有固定地址,所以constexpr指针不能指向这样的变量。相反,所有定义在函数体之外的对象,地址都是固定不变的,能用来初始化constexpr指针。某些在函数体内定义有固定地址的变量(如局部static变量),也能用来初始化constexpr。

当constexpr修饰指针时,表示的意义与const相差甚远。

const int* p = nullptr;// low-const

constexpr int* q = nullptr;// top-const(类似于int* const q = nullptr)

p是一个指针变量,指向一个int型常量。而q是一个编译时常量,q的值不能变,但q指向的对象值可以改变。

constexpr常量可以用字面值初始化,也可以用constexpr函数初始化。constexpr函数满足条件如下

1、函数返回类型以及所有的参数类型都必须是constexpr

2、函数有且只有一个return语句


编译器会将constexpr函数视为内联函数!所以在编译时若能求出其值,则会把函数调用替换成结果值。


看下面的代码

constexpr test(size_t s) { ruturn 4*s;}


int a[test(2)]; //正确

int i = 2; int a[test(i)]; // 错误。这个返回值不是编译时常量。不能用来定义数组的长度。


0 0
原创粉丝点击