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

时间:2018-11-15 12:39:46

标签: c++ initialization c++17

尼古拉·乔苏蒂斯(Nicolai Josuttis)在CppCon 2018上的“ C ++初始化的噩梦”演示中,有一段代码如下:

std::vector< std::string > v07 = {{ "1", "2" }};

尼古拉said the following(转录本):

  

问题是,这里发生的是,我们将这两个参数解释为 iterators 。因此,这些是迭代器,因此 this 是范围的开始,而 this 是范围的结束,并且它们应该引用相同范围的字符;因为字符会隐式转换为字符串,因此会进行编译。如果幸运的话,您将获得一个核心转储。如果没有,那么您将遇到一个大问题。

他在那里失去了我。有人可以逐步解释一下这里发生了什么吗?

1 个答案:

答案 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。