c++ 使用初始化列表从多个char数组构造std::string

nxagd54h  于 2023-06-25  发布在  其他
关注(0)|答案(1)|浏览(195)

只是提醒一下,我不是在要求一个解决这个问题的办法,而是对一种行为的解释。通过提供包含多个C样式字符串的初始化列表来构造std::string的示例不会导致编译错误,但会导致运行时错误。代码如下:

std::string s{"abc", "bcd"};
std::cout << s << std::endl;

构造函数的签名是string (initializer_list<char> il);。它是如何处理(尝试处理)这些字符数组的?
错误如下:

terminate called after throwing an instance of 'std::length_error'
  what():  basic_string::_M_create
[1]    89429 IOT instruction (core dumped)  ./a.out
hgqdbh6s

hgqdbh6s1#

接受std::initializer_list<char>的构造函数只能用于从多个字符创建字符串,而不能从多个其他字符串创建字符串。例如:

std::string s{'a', 'b', 'c', 'b', 'c', 'd'};

注意列表初始化不仅会调用接受std::initializer_list的构造函数,它还可以调用其他构造函数。只有 * 如果 * 一个接受std::initializer_list的构造函数可以用列表初始化调用,它 * 总是 * 在重载解析中获胜(除了空列表,这是值初始化)。
在这种情况下,它不能被使用,所以另一个构造函数被调用。由于这个构造函数,你会得到一个错误:

template< class InputIt >
basic_string(InputIt first, InputIt last,
             const Allocator& alloc = Allocator() );

字符串文字"abc""bcd"可以用作迭代器,如果"bcd" < "abc"(指针比较),则计算出的范围"bcd" - "abc"的大小为负,或者在转换为std::size_t后为五兆字节,这可能对您的系统来说有点太大了。结果是抛出std::length_error

解决方案

要从一个或多个字符串构造一个字符串,您可以这样做:

auto s = std::string("abc") + "bcd";
// or
using namespace std::string_literals;
auto s = "abc"s + "bcd"s;

标签:std::string constructors on cppreference

相关问题