将initializer_list插入vector <string>时,VS2013 SP5崩溃

时间:2016-05-06 00:03:07

标签: c++ visual-studio c++11 visual-studio-2013 initializer-list

使用以下代码查看崩溃。我知道initialize_lists在VS中声名狼借,但我认为其中大部分都是用2013 sp3修复的。相同的代码在g ++(6.1)中工作正常。我在这里错过了什么吗?这似乎太简单了。

调试器表明xstring模块中的迭代器无效问题。相同的代码可以找到整数,所以我猜它与某种字符串特定的优化有关。

#include <vector>
#include <iostream>
#include <string>

int main(int argc, char** argv)
{
    std::vector<std::string> x = {"a","b","c","d"};

    for(auto i : x)
        std::cout << i << ":";
    std::cout << std::endl;

    x.insert(x.end(), {"e","f"});  // Crash here

    for(auto i : x)
        std::cout << i << ":";
    std::cout << std::endl;

    return 0;
}

1 个答案:

答案 0 :(得分:0)

如果您尝试插入x.insert(x.end(), {"e","f", "g"});等3个元素,您会感到惊讶。没有崩溃,对吧!

这是MSVC 2013中的一个错误,似乎在MSVC 2015中已得到修复。以下是解释问题发生位置的解释。如果您只尝试声明std::string a{ "a", "b" };,您会看到它编译得很好,但会导致崩溃。如果再添加一个元素,那么它根本就不会编译。因此,插入会发生的是它调用string构造函数而不是调用vector构造函数。