CppCon 2018,Nicolai Josuttis:为什么这些被解释为迭代器?

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)构造,但startend必须引用相同的字符串对象. "1""2"是两个不同的对象,因此它导致UB.

  • UB到底代表什么? (3认同)