繁体   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