【问题标题】:CppCon 2018, Nicolai Josuttis: Why are these interpreted as iterators?CppCon 2018,Nicolai Josuttis:为什么这些被解释为迭代器?
【发布时间】:2019-04-18 13:42:09
【问题描述】:

Nicolai Josuttis 在 CppCon 2018 上的“C++ 中初始化的噩梦”演讲曾一度包含以下代码:

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

Nicolai said the following(我的转录本):

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

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

【问题讨论】:

    标签: c++ initialization c++17


    【解决方案1】:

    以下代码

    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) 构造函数, 但startend 必须引用同一个字符串对象。 “1”“2”是两个不同的对象,所以会导致UB。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 2010-12-20
    • 2021-04-29
    相关资源
    最近更新 更多