从 C 字符串构造 std::string 与从另一个 std::string 构造 std::string 不一致
Inconsistency constructing std::string from C-string vs. from another std::string
为什么std::string
构造函数仅根据构造的字符串类型产生不同的输出?
例如,请考虑以下C++代码:
#include <iostream>
#include <string>
int main() {
char cstyle[] = "01234567";
std::string std = "01234567";
std::cout << std::string(cstyle, 4) << std::endl;
std::cout << std::string(std, 4) << std::endl;
return 0;
}
这将产生以下输出:
0123
4567
我希望他们都生产0123
,或者两者都产生4567
,但我不希望一个产生0123
,另一个产生4567
。
为什么会出现这种不一致?
编辑:这个问题不是关于调用哪个默认构造函数,或者它们是否做不同的事情。它们做不同的事情,并调用不同的构造函数。这个问题是关于他们为什么不做同样的事情。换句话说,这更像是一个哲学问题,而不是一个技术问题。
在每种情况下,都有一个带有和没有进一步整数参数的重载;我们可以认为它们是可选的。 对于来自const char*
的构造函数,一个附加参数是大小(如果输入不是以 null 结尾的,则需要该参数(;如果你想要一个起始偏移量,你可以只写std::string(p+off,sz)
,所以把它作为参数提供是没有意义的。
但是,当复制另一个string
对象时,std::string(s.data()+off,sz)
是迂回且不安全的。 如果没有源对象,就不可能防止偏移量或显式大小使其溢出;从历史上看,data()
并不总是(保证(以 null 终止,因此在没有大小的情况下,这种用法是不安全的。 因此,为类似复制的构造函数提供了起始偏移量和大小(按该顺序,因为这更自然(,如果您只提供一个,则它必须是偏移量。
相关文章:
- 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),反之亦然