为什么 std::string::append() 不如 std::string::operator+() 强大

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

本文关键字:string std operator+ 强大 append 为什么 不如      更新时间:2023-10-16

我注意到

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 方法的包装器,但事实似乎并非如此。

我认为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');的特定用例(和重载),或者认为替代方案就足够了。

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

添加

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

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

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


替代设计可以争论,但考虑到标准和这个类的成熟度,它们不太可能很快被改变 - 它很可能会破坏很多代码。

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

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

另一种,正如一些对basic_string的批评中所描述的,是去除append,有很多方法可以实现它的作用。