当函数被声明为 constexpr 时,它必须能够在编译时求值并返回一个常量表达式,而不能包含运行时才能确定的操作。请详细解释,并举两个具有代表性的例子
时间: 2024-02-05 17:10:45 浏览: 24
constexpr 是 C++11 引入的一个关键字,用于指示编译器在编译时求值函数,从而生成编译时常量。这样可以优化程序执行效率,因为编译时常量可以在编译期间进行计算,而无需在程序运行期间进行计算。
当一个函数被声明为 constexpr 时,编译器要求该函数必须满足以下两个条件:
1. 函数体中只能包含编译时可确定的操作,不能包含运行时才能确定的操作,例如 I/O 操作、动态内存分配等。
2. 函数的返回值必须是一个常量表达式。
下面是两个具有代表性的例子:
1. 计算斐波那契数列的第 n 项。斐波那契数列的第 n 项可以通过递归计算得到,但递归计算会导致程序运行效率低下。使用 constexpr 可以在编译时计算出斐波那契数列的第 n 项,从而避免了递归计算的开销。
```c++
constexpr int fibonacci(int n)
{
return (n <= 1) ? n : fibonacci(n - 1) + fibonacci(n - 2);
}
int main()
{
constexpr int result = fibonacci(10); // 编译时计算斐波那契数列的第 10 项
std::cout << result << std::endl; // 输出 55
return 0;
}
```
2. 计算数组元素的平均值。如果数组长度固定且为常量,可以使用 constexpr 函数计算数组元素的平均值。
```c++
constexpr double average(const double* array, const int length)
{
double sum = 0;
for (int i = 0; i < length; i++)
{
sum += array[i];
}
return sum / length;
}
int main()
{
constexpr double arr[] = {1.0, 2.0, 3.0, 4.0, 5.0};
constexpr double avg = average(arr, 5); // 编译时计算数组元素的平均值
std::cout << avg << std::endl; // 输出 3.0
return 0;
}
```