C++14变量模板(Variable Template)与constexpr放宽
请说明C++14引入的变量模板(Variable Template)的语法和典型应用,以及constexpr函数的规则放宽(允许局部变量、循环、条件分支等),并给出示例。
回答
编译有声
变量模板(C++14):可定义参数化的常量/变量。
template<typename T>
constexpr T pi = T(3.1415926535897932385);
template<typename T>
T circle_area(T r) { return pi<T> * r * r; }
标准库中的应用:std::is_integral_v<T> 实际上是 std::is_integral<T>::value的变量模板简写。
// C++11: std::is_integral<T>::value
// C++17: std::is_integral_v<T>
// 但变量模板是C++14特性,标准库在C++17中全面应用
constexpr放宽(C++14):
- 允许函数体内有局部变量声明(非常量)。
- 支持if-else、switch、循环(for/while/do-while)。
- 允许修改生命周期在函数内开始的对象。
constexpr int factorial(int n) { // C++14
int result = 1;
for (int i = 2; i <= n; ++i) result *= i;
return result;
}
static_assert(factorial(5) == 120); // 编译期求值