書中定義:「常量表達式是指值不會改變並且在編譯過程中就能得到結果的表達式。顯然,字面值屬於常量表達式。」
又云:「字面值類型包括算術類型、引用和指針。」
疑問:
int a = 42;中a是整型變量,屬於字面值類型,那它是否也是常量表達式?
C++ 中「表達式」是一個廣義概念:
42 — 字面值,也是常量表達式a — 變量名,是表達式,但不是常量表達式(值可變)a + 42 — 算術表達式a = 42 — 賦值表達式| 概念 | 說明 | 例子 |
|---|---|---|
| 字面值類型 | 類型分類:標量類型、引用、指針等 | int, double&, int* |
| 字面值 | 代碼中直接書寫的固定值 | 42, 3.14, "hello" |
| 常量表達式 | 編譯期可求值且不變的表達式 | 42, sizeof(int), const int x = 10 |
int a = 42; // a 是「整型字面值類型」的「變量」
const int b = 42; // b 是「常量表達式」(編譯期已知、不可變)
a 的類型是字面值類型,但 a 本身是變量,其值運行期可改變,故不是常量表達式。
原版英文區分:
中文版易混淆「字面值類型」與「字面值」,導致概念模糊。建議對照原版閱讀。
能用於 數組長度、模板參數、enum 值、constexpr 變量初始化 的,才是常量表達式:
constexpr int size = 10; // ✓
int arr[size]; // ✓
template int N; void foo() {} // ✓
int a = 42;
int arr2[a]; // ✗ 非 C++ 標準(VLA)