Dev*_*lar 34 c++ initialization c++17
Nicolai Josuttis在CppCon 2018上的"C++初始化的梦魇"演讲中,曾经有过以下代码:
std::vector< std::string > v07 = {{ "1", "2" }};
Run Code Online (Sandbox Code Playgroud)
Nicolai 说以下(转录矿):
问题是,这里发生的是,我们将这两个参数解释为迭代器.所以这些是迭代器,所以这是范围的开始,这是范围的结束,它们应该引用相同的字符范围; 因为字符隐式转换为字符串,这将编译.如果你很幸运,你会得到一个coredump.如果没有,你就有了一个大问题.
他在那里失去了我.有人可以一步一步地解释这里发生了什么吗?
raf*_*x07 43
下面的代码
std::vector< std::string > v07 = { { "1", "2" } };
Run Code Online (Sandbox Code Playgroud)
相当于
std::string s = {"1","2"}; // call string(const char*, const char*)
std::vector<std::string> v07 = {s}; // initializer list with one item
Run Code Online (Sandbox Code Playgroud)
问题在于
s={"1","2"};
Run Code Online (Sandbox Code Playgroud)
这就要求string(const char* start, const char* end)
构造,但start
并end
必须引用相同的字符串对象. "1"和"2"是两个不同的对象,因此它导致UB.