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

常量表达式的值需要在编译时确定。只有字面值类型(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
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值