CodeWalk

C++14变量模板(Variable Template)与constexpr放宽

作者:编译有声 · 2026-05-30 12:55

请说明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); // 编译期求值