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

Fab*_*ian 11 c++ string stl

我注意到了

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

是否有任何理由说明该append方法不支持附加单个字符?我假设它operator+=实际上是该append方法的包装器,但似乎并非如此.

Dev*_*lar 6

我认为这operator+=()是为了处理所有简单的情况(仅采用一个参数),而append()对于需要多个参数的事物.

我其实对更惊讶存在单参数append( const basic_string& str )append( const CharT* s )比对缺席append( CharT c ).

另请注意我上面的评论:char只是一个整数类型.添加单参数,整数类型的重载append()- 或构造函数(根据设计,已经有几个整数类型的重载)可能会引入歧义.

除非有人找到一些书面理由,或者某些委员会成员在这里发布了他们对讨论的记忆,否则这可能是一个很好的解释.


Nia*_*all 2

有趣的是,这里的形式append

string& append( size_type count, CharT ch );
Run Code Online (Sandbox Code Playgroud)

镜像构造函数采用类似的输入

basic_string( size_type count, 
              CharT ch, 
              const Allocator& alloc = Allocator() );
Run Code Online (Sandbox Code Playgroud)

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

字符串类很大,可能str.append('b');没有考虑特定的用例(和重载),或者认为替代方案足够了。

int如果积分和char对应(在某些平台上可能是这种情况),那么简单地引入单个重载可能会带来歧义。

append添加单个字符有多种选择。

  • 可以添加包含单个字符的字符串str.append("b");。虽然不完全相同,但效果是一样的。
  • 如前所述有operator+=
  • 还有push_back(),和其他标准集装箱是一致的

要点是,它可能从未被视为用例(或足够强大的用例),因此,没有添加合适的重载/签名append来满足它。


替代设计可能会引起争议,但考虑到标准和此类的成熟度,它们不太可能很快就会改变 - 它很可能会破坏大量代码。

append也可以考虑替代签名;一种可能的解决方案是颠倒countand的顺序char(可能添加默认值);

string& append(CharT ch, size_type count = 1);
Run Code Online (Sandbox Code Playgroud)

另一种,正如一些批评中所述,basic_string删除append,有很多方法可以实现它的功能。