将 initializer_list 插入向量 <string> 时 VS2013 SP5 崩溃

Crash in VS2013 SP5 when inserting initializer_list into vector<string>

使用以下代码发现崩溃。我知道 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;
}

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

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