template<unsigned M, unsigned N>
int compare1(const char (&a)[M], const char (&b)[N]);
int compare2(const char * const &a, const char * const &b);
int compare3(const char *&a, const char *&b);
int compare4(char * const &a, char * const &b);
compare1("hello", "world"); // ✓
compare2("hello", "world"); // ✓
compare3("hello", "world"); // ✗
compare4("hello", "world"); // ✗
const char (&a)[M]M的const char數組"hello"(類型const char[6])推導出M=6const char (&)[M]const char * const &aconst char*(指向常量字符的指針)const &(常量引用)const char*,綁定到const引用延長臨時對象壽命const char *&a 失敗原因const char*是右值T& 不能綁定右值const char * const &或const char *&& (C++11右值引用)char * const &a 失敗原因const char*,不可隱式轉為char*char*但棄用,引用綁定更嚴格直接報錯| 聲明 | 含義 | 能綁定字符串字面值 | 備註 |
|---|---|---|---|
const char* const& | 指向常量字符的常量指針的引用 | ✓ | 推薦:雙重const保護 |
const char* const | 指向常量字符的常量指針 | ✓ | 值傳遞,拷貝指針 |
const char*& | 指向常量字符的指針的引用 | ✗ | 非const引用不可綁右值 |
const char* | 指向常量字符的指針 | ✓ | 最常用參數形式 |
char* const& | 常量指針的引用(指向可變字符) | ✗ | 字面值不可轉char* |
char*& | 指針的引用 | ✗ | 同上 |
char* | 指向可變字符的指針 | ⚠ | C++棄用轉換,僅兼容C |
char ch = 'a';
char* p = &ch;
char*& pch1 = p; // ✓ 引用同類型指針
char* const& pch2 = p; // ✓ const引用綁定非常量對象
const char*& pch3 = p; // ✗ 類型不匹配:char* → const char* 需轉換,產生臨時量,非const引用不可綁
const char* const& pch4 = p; // ✓ const引用可綁定轉換產生的臨時量
const char[N],可退化為const char*const char* const &中最右側const修飾引用本身,左側修飾指向內容const char*或std::string_view (C++17)template<size_t N> void f(const char(&)[N])T*&、T* const&等複雜指針引用參數,易誤用且限制調用-Wwrite-strings捕獲字符串字面值棄用轉換C++類型系統中const、引用、指針的組合遵循嚴格的綁定規則。理解「右值不能綁定非const左值引用」與「隱式轉換產生臨時量」兩大原則,即可推導出所有匹配/不匹配情況。實際工程中應傾向簡潔的const T*或std::string_view參數形式。