摘要
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