簡體   English   中英

為什么std :: string :: append()的功能不如std :: string :: operator +()?

[英]Why is std::string::append() less powerful than std::string::operator+()?

我注意到了

std::string str;
str += 'b'; // works
str.append('b'); // does not work
str.append(1, 'b'); // works, but not as nice as the previous

是否有任何理由為什么append方法不支持append單個字符? 我假設operator+=實際上是append方法的包裝器,但似乎並非如此。

我認為operator+=()旨在處理所有簡單情況(只接受一個參數),而append()用於需要多個參數的東西。

實際上,我對單參數append( const basic_string& str )append( const CharT* s )存在感到更加驚訝,而不是缺少 append( CharT c )

另請注意我上面的評論: char只是一個整數類型。 append()添加單參數整數類型重載 - 或者構造函數(根據設計,已經有幾個整數類型重載)可能會引入歧義。

除非有人找到一些書面理由,或者某些委員會成員在這里發布了他們對討論的記憶,否則這可能是一個很好的解釋。

有趣的是要注意這里的append形式;

string& append( size_type count, CharT ch );

鏡像構造函數采用類似的輸入

basic_string( size_type count, 
              CharT ch, 
              const Allocator& alloc = Allocator() );

以及其他一些使用字符count方法,例如resize( size_type count, CharT ch );

字符串類很大,可能是str.append('b');的特定用例(和重載str.append('b'); 未考慮,或替代品被認為是充分的。

簡單地說,如果積分intchar對應,則引入單個重載可能會引入歧義(在某些平台上可能就是這種情況)。

添加單個字符的append有幾種替代方法。

  • 添加包含單個字符的字符串可以完成str.append("b"); 雖然這不完全相同,但它具有相同的效果。
  • 如上所述,有operator+=
  • 還有push_back() ,它與其他標准容器一致

重點是,它可能從未被視為用例(或足夠強大的用例),因此,沒有添加合適的重載/簽名來append以滿足它。


替代設計可能會有爭議,但考慮到標准和本課程的成熟度,它們不太可能很快就會改變 - 它很可能會破壞很多代碼。

也可以考慮append替代簽名; 一種可能的解決方案可能是顛倒countchar的順序(可能添加默認值);

string& append(CharT ch, size_type count = 1);

另外,正如一些basic_string批評所描述的那樣是刪除append ,有很多方法可以實現它的功能。

暫無
暫無

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

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