img

问题描述

如下代码中:

cons int a = 8;

consexpr int a = 8;

这两个定义的常量有什么区别?

问题分析

constconstexpr 都是用于定义常量的关键字,但它们有一些不同之处:

  1. const 常量是在运行时计算的,而 constexpr 常量是在编译时计算的。这意味着 constexpr 常量可以被用于要求常量表达式的上下文中,比如数组大小、模板参数等。而 const 常量则不能。
  2. constexpr 常量只能被赋值为编译时常量表达式,而 const 常量可以被赋值为任何表达式,包括运行时表达式。

在代码中,const int aconstexpr int a 都定义了一个名为 a 的常量,并赋值为 8
它们的区别在于,const int 常量是在运行时计算的,而 constexpr int 常量是在编译时计算的。

因此:

  • 如果需要在编译时计算一个常量,建议使用 constexpr 来定义常量。
  • 如果需要在运行时计算一个常量,或者需要在常量表达式之外对其进行赋值,可以使用 const 来定义常量。

举例说明

#include <iostream>

constexpr int x = 5 + 3;  // 编译时常量表达式
const int y = x * 2;      // 运行时表达式

int main()
{
    constexpr int z = x * y;  // 编译错误,y 不是编译时常量表达式
    std::cout << "x = " << x << std::endl;
    std::cout << "y = " << y << std::endl;
    return 0;
}

在上面的代码中,x 是一个 constexpr 常量,其值是 5 + 3,这是一个编译时常量表达式。而 y 是一个 const 常量,其值是 x * 2,这是一个运行时表达式。在 main() 函数中,我们试图用 xy 计算一个新的常量 z,但是由于 y 不是编译时常量表达式,所以编译器会报错。

因此,可以看出 constexpr 常量只能被赋值为编译时常量表达式,而 const 常量可以被赋值为任何表达式,包括运行时表达式。

后记

如果你喜欢我的内容, 请关注我的微信公众号:

或者加入微信群, 一起交流学习。

image-20230423125404712