MST

星途 面试题库

面试题:C++ 中 constexpr 函数与 const 在常量表达式里的协同

在 C++ 中,constexpr 函数经常和 const 一起用于常量表达式。请详细阐述它们如何协同工作,并且说明如果在一个本应使用常量表达式的场景下,仅正确使用了 const 而未使用 constexpr 可能会出现什么问题,并举例代码说明。
28.7万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. constexprconst 协同工作
    • const:用于声明常量,其值一旦初始化后就不能被修改。在变量声明时使用,例如 const int num = 10; 这里 num 是一个常量整数,之后不能对其重新赋值。它主要侧重于运行时的常量性,编译器在编译时不一定能确定其值。
    • constexpr:用于声明常量表达式函数或变量。对于 constexpr 变量,编译器在编译时就会计算其值,它的值必须是编译期可确定的常量表达式。对于 constexpr 函数,要求函数的返回值必须是编译期可计算的,且函数体必须满足一定的限制(例如只能包含返回语句等简单语句)。
    • 协同工作:当声明一个常量表达式变量时,constconstexpr 可以一起使用,例如 constexpr const int value = 20;。这里 const 强调值不可变,constexpr 强调编译期可求值。在函数参数或返回值中,如果希望该值在编译期可处理且不可变,也可以结合使用。例如:
constexpr int add(constexpr const int a, constexpr const int b) {
    return a + b;
}
  1. 仅使用 const 而未使用 constexpr 在常量表达式场景下的问题
    • 问题:在一些需要编译期常量表达式的场景中,仅使用 const 可能无法满足要求。例如,在数组的大小声明中,如果数组大小必须是编译期常量,仅 const 变量可能不行,因为 const 变量的值可能在运行时才确定。编译器可能会报错,提示数组大小必须是常量表达式。
    • 示例代码
#include <iostream>
void test() {
    int runtimeValue = 5;
    const int constValue = runtimeValue; // const 变量的值在运行时确定
    // int arr[constValue]; // 错误:数组大小必须是常量表达式,因为 constValue 不是编译期常量
    constexpr const int constexprValue = 10;
    int arr2[constexprValue]; // 正确,constexprValue 是编译期常量
}
int main() {
    test();
    return 0;
}

在上述代码中,constValue 虽然是 const,但其值依赖于运行时变量 runtimeValue,所以不能用于需要编译期常量表达式的场景(如数组大小声明)。而 constexprValue 满足编译期常量的要求,可以用于此类场景。