为什么std::string::append()比std::string::operator+()功能更弱?

12

我注意到

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


从技术上讲,并不是说它不够强大,而是没有人认为有必要编写一个 std::string::append(char)。如果你想这样做,请使用 += - Mats Petersson
你可以使用 std::string::append(count, char),其中 count=1 或者 std::string::push_back(char) - Simon Kraemer
3
面带玩笑的回答是,没有人成功地说服C++标准委员会这个函数的必要性。你能行吗?不过这个问题问得好。我认为添加必要的重载不会导致任何问题。 - Bathsheba
2
@Niall:委员会可能比你认为的更聪明。 我不能代表他们说话,但我是这样看待这个问题的:对于编译器来说,char 只是另一种整数类型。 在某些平台上,sizeof(char)sizeof(int)实际上可能是相同的。看看std::string构造函数和append()重载列表。拥有一个接受单个整数值的重载可能会有些容易出错--而且您还有语义相同的选项,例如 std::string("b")append("b")operator+=("b")operator+=('b')+=只有一个整数重载。 - DevSolar
@DevSolar。这并不是对他们智力的批评。这个类很大,可能没有考虑到方法“append”的使用情况。 - Niall
显示剩余3条评论
2个回答

6
我认为operator+=()旨在处理所有简单情况(仅使用一个参数),而append()用于需要多个参数的情况。
实际上,我更惊讶于单参数append( const basic_string& str )append( const CharT* s )的存在,而不是append( CharT c )的缺失。
还请注意我的上面的评论:char只是一种整数类型。向append()添加单参数整数类型重载或构造函数(根据设计,已经有几个整数类型重载)可能会引入歧义。
除非有人找到某些书面原理,或者委员会成员在这里发布他们对讨论的记忆,否则这可能是任何解释中最好的一个。

2
有趣的是要注意这里的append形式;
string& append( size_type count, CharT ch );

镜像了接受 相似输入 的构造函数。
basic_string( size_type count, 
              CharT ch, 
              const Allocator& alloc = Allocator() );

一些其他的方法需要一个带有字符的计数,比如resize( size_type count, CharT ch );
字符串类很大,可能没有考虑到str.append('b');的特定用例(和重载),或者认为已经有足够的替代方法了。
如果整数int和字符char对应(在某些平台上可能是这样),那么引入单个重载就可能会导致歧义。
有几种替代方法可以添加单个字符:
  • 可以使用包含单个字符的字符串来添加,例如str.append("b");。虽然不完全相同,但效果相同。
  • 如前所述,可以使用operator+=
  • 还有push_back(),与其他标准容器一致
问题在于,可能从未考虑过这种用例(或者用例不够强烈),因此没有向append中添加适当的重载/签名来满足它。
替代设计可能会引起争议,但考虑到该标准和这个类的成熟度,很可能不会很快改变 - 这很可能会破坏很多代码。
还可以考虑使用其他的append签名;一个可能的解决方案是反转countchar的顺序(可能添加一个默认值)。
string& append(CharT ch, size_type count = 1);

另一种方法,如一些basic_string的批评所描述的那样,是移除append,有许多方法可以实现它的功能。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接