字面量操作符的聲明與使用
字面量操作符 RETURN_TYPE operator “” FuncName(paramList)
參數類型
根據 C++ 11 标準,隻有下面這些參數是合法的:即paramList隻能是下面這些類型
char const*
unsigned long long
long double
char const*, std::size_t
wchar_t const*, std::size_t
char16_t const*, std::size_t
char32_t const*, std::size_t
最後四個對于字元串相當有用,因為第二個參數會自動推斷為字元串的長度;
樣例:
const char* operator "" test(const char* s)
{
cout << s << endl;
return s;
}
const char* operator "" _test2(const char* s)
{
cout << s << endl;
return s;
}
const char* operator "" _test3(const char* s, size_t len)
{
cout << s << endl;
cout << len << endl;
return s;
}
int main()
{
cout << 123test << endl;
cout << "45"_test2 << endl;
cout << "789"_test3 << endl;
return 0;
}
上述代碼編譯會報2個錯誤:
warning: literal operator suffixes not preceded by '_' are reserved for future standardization [-Wliteral-suffix]
const char* operator "" test(const char* s)
^
原因: 使用者自定義字面量操作符的函數名稱需要以 下劃線開頭;
unable to find string literal operator 'operator""_test2' with 'const char [3]', 'long long unsigned int' arguments
cout << "45"_test2 << endl;
原因: 字面量操作符函數隻定義一個(const char*) 參數時,這個時候表示的是原始字面量操作符;即字元串中的内容,而不是一個字元串;根據上述簽名定義,除去字元串類型的參數,隻有unsigned long long / long double; 是以這裡可以傳遞整數或浮點數。
修改後的代碼:
const char* operator "" _test(const char* s)
{
cout << s << endl;
return s;
}
const char* operator "" _test2(const char* s, size_t len)
{
cout << s << endl;
cout << len << endl;
return s;
}
int main()
{
cout << 123_test << endl;
cout << 4.5_test << endl;
cout << "13"_test2 << endl;
return 0;
}
輸出結果:
123
123
4.5
4.5
13
2
13
輸出長度為2, 是因為自動根據字元串”13”的長度推導出的。
參考部落格: https://www.devbean.net/2012/05/cpp11-literals/