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

时间:2016-02-26 08:07:46

标签: 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

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

2 个答案:

答案 0 :(得分:5)

我认为operator+=()旨在处理所有简单情况(仅采用一个参数),而append()适用于需要多个参数的事物。

我实际上对单参数append( const basic_string& str )append( const CharT* s )存在比对{{1}的缺席更感到惊讶}。

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

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

答案 1 :(得分:2)

值得注意的是append这里的形式;

string& append( size_type count, CharT ch );

使用similar input镜像构造函数。

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

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

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

如果积分intchar对应(在某些平台上可能就是这种情况),简单地引入单个重载可能会引入歧义。

append添加单个字符有几种替代方法。

  • 添加包含单个字符的字符串str.append("b");。虽然这不完全相同,但它具有相同的效果。
  • 如上所述,有operator+=
  • 还有push_back(),与其他标准容器
  • 一致

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

备选设计可能会受到争议,但考虑到标准和本课程的成熟度,它们不太可能很快改变 - 它很可能会破坏很多代码。

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

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

另一个,如某些critique of basic_string中所描述的那样,删除append,有很多方法可以实现它的功能。