《C++ Primer》第 5 版 P37 提到:某些情況必須使用字面值前綴/後綴指定類型。本文結合 auto 類型推導,通過實例講透何時、為何必須顯式指定字面值類型。
auto i = 1; // 推導為 int
auto d = 1.0; // 推導為 double
auto f = 1.0f; // 後綴 f → float
auto l = 1L; // 後綴 L → long
auto u = 1u; // 後綴 u → unsigned int
auto ul = 1ul; // 組合 → unsigned long
規則:auto 按字面值**字面類型**推導。若字面值類型非預期類型,**必須加後綴**強制指定。
| 場景 | 錯誤寫法 | 正確寫法 | 說明 |
|---|---|---|---|
| 需 float 而非 double | auto f = 3.14; | auto f = 3.14f; | 浮點字面值默認 double |
| 需 long long / int64_t | auto id = 1234567890123; | auto id = 1234567890123LL; | 整數字面值默認 int,超範圍報錯或截斷 |
| 需 unsigned 類型 | auto flag = 0xFFFFFFFF; | auto flag = 0xFFFFFFFFu; | 十六進制無後綴時類型為第一個能容納的有符號類型 |
| 字符/字符串字面值 | auto c = '中'; | auto c = u'中'; / U'中'; | char16_t/char32_t 前綴 |
| 用戶定義字面值 | auto dur = 3.5_s; | 需定義 operator"" _s | C++11 自定義字面值 |
u8"...":UTF-8 字符串字面值 (const char*)u"...":UTF-16 字符串 (const char16_t*)U"...":UTF-32 字符串 (const char32_t*)L"...":寬字符串 (const wchar_t*)R"(...)":原始字符串字面值(不轉義)constexpr float PI = 3.14159f; 比 auto PI = 3.14159f; 更清晰。auto 推導模板參數時,字面值類型直接影響實例化類型,必須精確控制。當 auto 推導出的類型不是你想要的類型時,必須使用字面值前綴/後綴。 這不僅是語法要求,更是類型安全的關鍵防線。養成給關鍵字面值加後綴的習慣,能避免無數隱式轉換導致的難查蟲子。