提问人:Zlatan Radovanovic 提问时间:6/22/2023 更新时间:6/22/2023 访问量:75
使用初始值设定项列表从多个 char 数组构造 std::string
Construct std::string from multiple char arrays using initializer list
问:
只是提醒一下,我不是在寻求解决这个问题的解决方案,而是在解释一种行为。通过提供具有多个 C 样式字符串的初始值设定项列表来构造 的实例不会导致编译错误,但会导致运行时错误。代码如下:std::string
std::string s{"abc", "bcd"};
std::cout << s << std::endl;
构造函数的签名是 。它究竟如何对待(尝试处理)这些 char 数组?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
答:
4赞
Jan Schultke
6/22/2023
#1
接受 an 的构造函数只能用于从多个字符创建字符串,而不能从多个其他字符串创建字符串。例如: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
std::initializer_list<char>
{"abc", "bcd"}
sdtd::initializer_list<const char*>