【问题标题】:Why is std::string::append() less powerful than std::string::operator+()?为什么 std::string::append() 不如 std::string::operator+() 强大?
【发布时间】:2016-02-26 08:07:46
【问题描述】:

我注意到了

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)。如果你想这样做,请使用+=...
  • 您可以将std::string::append(count, char)count=1std::string::push_back(char)一起使用
  • 滑稽的回答是,没有人能够说服 C++ 标准委员会相信它的必要性。您可以...吗?不过很好的问题。我看不出引入必要的重载会破坏任何东西。
  • @Niall:委员会可能比你想象的要聪明。我不能代表他们说话,但我是这样看的:对于编译器来说,char 只是另一种整数类型。在某些平台上,sizeof( char )sizeof( int ) 实际上可能是相同的。查看std::string 构造函数和append() 重载列表。有一个采用单个整数值的重载可能有点容易出错——而您确实拥有语义相同的std::string( "b" )append( "b" )operator+=( "b" )operator+=( 'b' )+= 只有一个整数重载。

标签: c++ string stl


【解决方案1】:

我认为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 );
    

    镜像构造函数采用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,有很多方法可以实现它的作用。

    【讨论】:

      猜你喜欢
      • 2021-12-10
      • 1970-01-01
      • 2013-11-19
      • 2023-03-21
      • 2021-11-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-03
      相关资源
      最近更新 更多