尼古拉·乔苏蒂斯(Nicolai Josuttis)在CppCon 2018上的“ C ++初始化的噩梦”演示中,有一段代码如下:
std::vector< std::string > v07 = {{ "1", "2" }};
尼古拉said the following(转录本):
问题是,这里发生的是,我们将这两个参数解释为 iterators 。因此,这些是迭代器,因此 this 是范围的开始,而 this 是范围的结束,并且它们应该引用相同范围的字符;因为字符会隐式转换为字符串,因此会进行编译。如果幸运的话,您将获得一个核心转储。如果没有,那么您将遇到一个大问题。
他在那里失去了我。有人可以逐步解释一下这里发生了什么吗?
答案 0 :(得分:43)
下面的代码
.addOnProgressListener
等同于
std::vector< std::string > v07 = { { "1", "2" } };
问题出在
std::string s = {"1","2"}; // call string(const char*, const char*)
std::vector<std::string> v07 = {s}; // initializer list with one item
这将调用 s={"1","2"};
构造函数,
但是string(const char* start, const char* end)
和start
必须引用相同的字符串对象。 “ 1” 和“ 2” 是两个不同的对象,因此它导致了UB。