C++ constexpr的作用,与const的区别

摘要

C++ Prime 阅读笔记 p43-51 2.3复合类型


一句话笔记

对于修饰object来说,
constexpr修饰的object: 告诉编译器我是编译期间可知的,尽可能的把我作为常量,当然,如果我不是常量,那就当成普通变量吧。(定义数组时有用)
const修饰的object: 告诉程序员没人改得了我,运行时不直接被修改。

举例:

int a = 1;
const int b = a + 2;
constexpr int c = a + 3;//ok 
int array_a[a];
int array_a[b];
int array_a[c];

对于修饰函数返回值来说,
constexpr修饰的函数: 如果函数其传入的参数使得返回值可以在编译时期计算出来,那么这个函数就会产生编译时期的值。如果传入的参数如果不能在编译时期计算出来,那么constexpr修饰的函数就和普通函数一样了。
告诉编译器我是编译期间可知的,尽可能的把我作为常量,当然,如果我不是常量,那就当成普通变量吧。(定义数组时有用)
const修饰的object: 告诉程序员没人改得了我,运行时不直接被修改。
然后我想对修饰函数多说两句,那就是constexpr修饰的函数,返回值不一定是编译期常量。#It is not a bug, it is a feature.#

例如:
template class C{};

constexpr int FivePlus(int x) {
return 5 + x;
}

void f(const int x) {
C c1; // Error: x is not compile-time evaluable.
C<FivePlus(6)> c2; // OK
}
至于这玩意儿有什么用呢?比如你想特化一个模板,在传入的模板参数是std::numeric_limits::max()时报错。那么在没有constexpr之前,就没救了,只能用INT_MAX宏…

相关/参考链接

《C++ prime 第五版》p58
https://www.zhihu.com/question/35614219

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值