使用初始值设定项列表从多个 char 数组构造 std::string

Construct std::string from multiple char arrays using initializer list

提问人:Zlatan Radovanovic 提问时间:6/22/2023 更新时间:6/22/2023 访问量:75

问:

只是提醒一下,我不是在寻求解决这个问题的解决方案,而是在解释一种行为。通过提供具有多个 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
C++ 字符串 构造函数 initializer-list

评论

6赞 john 6/22/2023
我想你的字符串文字被转换为指针,你正在调用接受两个输入迭代器的构造函数。这两个指针不是有效的迭代器范围,因此会出现错误。
0赞 Zlatan Radovanovic 6/22/2023
@john 当我在大括号中传递参数时,我不是显式调用了 initializer_list 构造函数吗?
1赞 NathanOliver 6/22/2023
@ZlatanRadovanovic 你是,但是 的初始值设定项列表构造函数需要一个 ,而 将是一个,所以你没有使用字符串初始值设定项列表构造函数,而是获取其迭代器对构造函数。std::stringstd::initializer_list<char>{"abc", "bcd"}sdtd::initializer_list<const char*>
0赞 Zlatan Radovanovic 6/22/2023
@NathanOliver-IsonStrike,我明白了,非常感谢。

答:

4赞 Jan Schultke 6/22/2023 #1

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

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

请注意,列表初始化不仅会调用接受的构造函数,还可以调用其他构造函数。 只有当构造函数可以通过列表初始化调用时,它总是在重载解析中获胜(空列表除外,即值初始化)。std::initializer_liststd::initializer_list

在这种情况下,它不能使用,因此调用另一个构造函数。 由于此构造函数,您收到错误:

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

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

溶液

要从一个或多个字符串构造字符串,您可以执行以下操作:

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

另请参阅:cppreference 上的 std::string 构造函数