const与constexpr
const
如果 const
变量的初始化值是常量表达式,那么它就是编译时常量。编译时常量使编译器能够执行非编译时常量无法提供的优化。
1 2 3 4 5 6 7 8 9 10 11
| #include <iostream>
int main() { const int x { 3 }; const int y { 4 };
std::cout << x + y;
return 0; }
|
当编译器编译时,它可以计算x+y的值,并将其替换为7。
任何用非常量表达式初始化的 const
变量都是运行时常量。运行时常量是在运行时才知道其初始化值的常量。
1 2 3 4 5 6 7 8 9 10 11 12
| #include <iostream>
int sum(int x, int y) { return x + y; }
int main() { const int x{3}; const int y{4}; const int z{sum(x, y)}; std::cout << x << " " << y << " " << z << "\n"; }
|
constexpr
当使用 const
时,变量最终可能是编译时的 const
或运行时的 const
,这取决于初始化式是否是常量表达式。
constexpr
变量只能是编译时常量。如果 constexpr
变量的初始化值不是常量表达式,编译器将出错。
1 2 3 4 5 6 7 8 9 10 11 12
| #include <iostream>
int sum(int x, int y) { return x + y; }
int main() { const int x{3}; const int y{4}; constexpr int z{sum(x, y)}; std::cout << x << " " << y << " " << z << "\n"; }
|