簡體   English   中英

為什么用戶定義的字符串文字和整數文字有不同的行為?

[英]Why do user-defined string literals and integer literals have different behavior?

我正在學習用戶定義的文字,並與以下測試代碼混淆:

std::chrono::seconds operator"" _s(unsigned long long s) {
    return std::chrono::seconds(s);
}

std::string operator"" _str(const char *s, std::size_t len) {
    return std::string(s, len);
}

int main() {
    auto str = "xxxxx"_str;
    std::cout << str.size() << std::endl;    // works

    auto sec = 4_s;
    std::cout << sec.count() << std::endl;   // works

    std::cout << "xxxxx"_str.size() << std::endl;   // works

    std::cout << 4_s.count() << std::endl;   // does **NOT** work!

    return 0;
}

編譯器給出以下錯誤信息:

錯誤:沒有匹配的文字運算符用於調用具有 'unsigned long long' 或 'const char *' 類型參數的 'operator""_s.count',並且沒有匹配的文字運算符模板
cout << 4_s.count() << endl;

似乎它將_s.count作為用戶定義的文字。 此外,浮點文字的行為類似於整數文字。

為什么用戶定義的整數文字和字符串文字有不同的行為?

這就是浮點文字的工作原理!!

添加一對括號,它應該可以工作:

std::cout << (4_s).count();

或者,將它們分開(以阻止編譯器將其解釋為格式錯誤的小數常量浮點文字):

std::cout << 4_s .count();
//              ^ Space here!

參考: CppReference.com

在上面參考的注釋部分,

由於最大的限制,以 [ p , P , (C++17 起)] eE結尾的用戶定義的整數和浮點字面量,當后面跟有運算符+-必須與運算符分開,在來源:

 long double operator""_E(long double); long double operator""_a(long double); int operator""_p(unsigned long long); auto x = 1.0_E+2.0; // error auto y = 1.0_a+2.0; // OK auto z = 1.0_E +2.0; // OK auto w = 1_p+2; // error auto u = 1_p +2; // OK

所以當涉及到用作小數點的點時,它必須與后面的任何內容分開,否則它將被視為浮點數的一部分

我已經從 CppReference 測試了上面的示例,並得到了一個非常相似的錯誤消息:

test.cpp:19:10: error: unable to find numeric literal
operator 'operator""_E+2.0'
                    ^^^^^^
 auto x = 1.0_E+2.0;  // error

知道如何將_E+2.0視為整個ud-suffix嗎?


我最初的解釋嘗試可以在這篇文章的修訂歷史中找到。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM