只是提醒一下,我不是在要求一个解决这个问题的办法,而是对一种行为的解释。通过提供包含多个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
1条答案
按热度按时间hgqdbh6s1#
接受
std::initializer_list<char>
的构造函数只能用于从多个字符创建字符串,而不能从多个其他字符串创建字符串。例如:注意列表初始化不仅会调用接受
std::initializer_list
的构造函数,它还可以调用其他构造函数。只有 * 如果 * 一个接受std::initializer_list
的构造函数可以用列表初始化调用,它 * 总是 * 在重载解析中获胜(除了空列表,这是值初始化)。在这种情况下,它不能被使用,所以另一个构造函数被调用。由于这个构造函数,你会得到一个错误:
字符串文字
"abc"
和"bcd"
可以用作迭代器,如果"bcd" < "abc"
(指针比较),则计算出的范围"bcd" - "abc"
的大小为负,或者在转换为std::size_t
后为五兆字节,这可能对您的系统来说有点太大了。结果是抛出std::length_error
。解决方案
要从一个或多个字符串构造一个字符串,您可以这样做:
标签:
std::string
constructors on cppreference