天天看點

C++ 字面量操作符 operator + 雙引号

字面量操作符的聲明與使用

字面量操作符 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/

繼續閱讀