面试题答案
一键面试constexpr
与const
协同工作const
:用于声明常量,其值一旦初始化后就不能被修改。在变量声明时使用,例如const int num = 10;
这里num
是一个常量整数,之后不能对其重新赋值。它主要侧重于运行时的常量性,编译器在编译时不一定能确定其值。constexpr
:用于声明常量表达式函数或变量。对于constexpr
变量,编译器在编译时就会计算其值,它的值必须是编译期可确定的常量表达式。对于constexpr
函数,要求函数的返回值必须是编译期可计算的,且函数体必须满足一定的限制(例如只能包含返回语句等简单语句)。- 协同工作:当声明一个常量表达式变量时,
const
和constexpr
可以一起使用,例如constexpr const int value = 20;
。这里const
强调值不可变,constexpr
强调编译期可求值。在函数参数或返回值中,如果希望该值在编译期可处理且不可变,也可以结合使用。例如:
constexpr int add(constexpr const int a, constexpr const int b) {
return a + b;
}
- 仅使用
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
满足编译期常量的要求,可以用于此类场景。