簡體   English   中英

為什么字符串(const char * s,size_t pos,size_t len = npos)有效?

[英]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*時,我發現這個超級有用,盡管我幾乎不關心一次復制整個字符串,但是我可以逃避執行任何mallocstrncpy而且我也不想編寫代碼以確保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.

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