首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ constexpr 深度解析:編譯期計算、常量表達式與 const 對比

     編輯:關於C++

核心定位

constexpr(C++11 引入,C++14 擴展)指示值或函數返回值在編譯期可計算。比 const 更強:const 只保證運行時不修改,constexpr 保證編譯期確定。

constexpr 變量:編譯期常量

constexpr int x = 42;           // OK
constexpr double pi = 3.14159;  // OK
constexpr int y = x + 1;        // OK,依賴 constexpr
int z = 10;
constexpr int w = z + 1;        // 錯誤!z 非 constexpr

// 字面值類型要求
struct Point { int x, y; };
constexpr Point p = {1, 2};     // C++14 支持聚合類型
// constexpr Point q = Point{1,2}; // C++11 需構造函數 constexpr

constexpr 函數:編譯期可執行函數

滿足條件時,調用結果為編譯期常量:

  • 函數體內只能包含:using、typedef、static_assert、單條返回語句(C++11)或簡單邏輯(C++14:允許局部變量、循環、條件分支)。
  • 參數和返回類型必須是字面值類型。
  • 遞歸深度受編譯器限制(通常 512+)。
// C++11 風格:遞歸實現
constexpr int factorial(int n) {
    return n <= 1 ? 1 : n * factorial(n-1);
}

// C++14 風格:迭代更直觀
constexpr int factorial(int n) {
    int res = 1;
    for (int i = 2; i <= n; ++i) res *= i;
    return res;
}

// 編譯期調用
constexpr int f5 = factorial(5); // 120
int arr[factorial(4)]; // 數組大小需編譯期常量

constexpr vs const 關鍵區別

場景constconstexpr
初始化時間運行時或編譯期必須編譯期
函數參數可修改(非常量引用)隱含 const
函數返回運行時計算編譯期可計算
指針語義const int* p:指向常量constexpr int* p:常量指針(指針本身不可改)

指針陷阱

const int* p1 = nullptr;     // 非常量指針,指向常量 int
constexpr int* p2 = nullptr; // 常量指針,指向非常量 int
constexpr const int* p3 = nullptr; // 常量指針,指向常量 int

constexpr 構造函數與字面值類型

類若滿足:

  1. 有 constexpr 構造函數
  2. 所有成員為字面值類型
  3. 析構函數為 trivial

則該類為字面值類型,可定義 constexpr 對象。

class Complex {
    double re, im;
public:
    constexpr Complex(double r, double i) : re(r), im(i) {}
    constexpr double real() const { return re; }
    constexpr double imag() const { return im; }
};

constexpr Complex c(3.0, 4.0); // 編譯期構造
static_assert(c.real() == 3.0, "compile-time check");

實戰:編譯期數組長度計算

template
constexpr size_t length(const T(&)[N]) { return N; }

constexpr int arr[] = {1,2,3,4};
constexpr int arr2[length(arr)*2] = {1,2,3,4,5,6,7,8}; // 編譯期計算長度

總結

  • constexpr 是現代 C++ 編譯期計算的核心工具。
  • 變量:強制編譯期初始化,替代宏常量。
  • 函數:允許編譯期執行,支援模板元編程、靜態斷言、數組大小等場景。
  • C++14 大幅放寬函數體限制,編寫體驗接近普通函數。
  • 指針語義異於 const:constexpr 修飾指針本身,而非指向對象。
  • 最佳實踐:凡是編譯期可確定的值,優先用 constexpr。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved