为什么 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
方法不支持追加单个字符有什么原因吗?我假设 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
的替代签名;一种可能的解决方案是颠倒count
和char
的顺序(可能添加默认值);
string& append(CharT ch, size_type count = 1);
另一种,正如一些对basic_string
的批评中所描述的,是去除append
,有很多方法可以实现它的作用。
- cppcheck在const std::string[]上引发警告
- 将std::string传递给WriteConsole API
- 为std::string的某个索引赋值
- std中有类似find_last_of的函数,而string中没有
- 使用 std::string () const 函数启动线程或未来
- 当我们进行一些操作时,应该使用什么'std::string'或'std::stringstream'?
- 如何更改大小(std::string)
- std::string 的对象真的可以移动吗?
- SegFault 同时使用 std::string::operator+= 和函数作为参数
- 无法从 std::string 中提取C++ Unicode 符号
- std::string 构造函数如何处理固定大小的 char[]?
- 确切地说,如何解释 std::getline(stream, string) 函数在C++中填充的字符串
- C++:考虑C++ std::string 中双引号 (") 的字面含义,而不使用反斜杠 (\)
- 'int main(int, int, std::__cxx11::string, std::__cxx11::string)'只需要零或两个参数 [-Wmain]
- C++ 在列表和列表之间选择返回类型<<string>std::p air<string,string>>
- std::string, std::wstring and UTF8
- uan inplace replacement of std::string/std::wstring?
- #define Glib::string std:wstring
- 从 std::string & std::wstring 中获取 char 整数值
- BSTR转换为std::string(std::wstring),反之亦然