[英]Why does string (const char* s, size_t pos, size_t len = npos) work?
它沒有在std :: string 構造函數doc中明確列出( 編輯:此處的人們說我應該引用實際的cppreference而不是cplusplus.com),但顯然可以。 這意味着就像strncpy
,不是嗎?
它起作用是因為它首先隱式地初始化了另一個std::string
對象,該對象是傳入的const char* string
的副本? 這是否意味着即使最終僅提取一定長度的子字符串,也要花很多精力來復制整個字符串?
似乎這樣的構造有點像string (const char* s+pos, size_t len)
除了參考文獻在這里說,如果len大於字符串長度,它將導致undefined behavior
; 但是在string (const char* s, size_t pos, size_t len = npos)
如果len再經過空終止符,那就很好了。 大概是因為,我猜這是在內部處理cpp字符串對象級別的內容,而前者正在處理指針。
為什么不在C ++參考文檔中列出該行為?
我的猜測是這是一種內部復制到std::string
對象,然后對其應用string (const string& str, size_t pos, size_t len = npos)
的怪異組合,因此不將其視為“標准”。 就是說,當我不得不將輸入作為char*
時,我發現這個超級有用,盡管我幾乎不關心一次復制整個字符串,但是我可以逃避執行任何malloc
和strncpy
而且我也不想編寫代碼以確保len不超出限制。
之所以有效是因為存在構造函數:
std::basic_string( const basic_string& other,
size_type pos,
size_type count = std::basic_string::npos,
const Allocator& alloc = Allocator() );
const char *
可隱式轉換為std::basic_string
,因此在您編寫(例如) std::string s {"abc", 1, 2};
時,在上述轉換之后調用上述構造函數std::string s {"abc", 1, 2};
為了解決您的效率問題,從char *
到std::basic_string
的隱式轉換涉及到臨時結構的構建,因此可以復制字符串。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.