此类代码中gcc和clang之间的行为不同

时间:2018-10-10 17:15:49

标签: c++ gcc vector initialization clang

int main() 
{
    std::vector<char> delimiters = { ",", ";" };  
    std::cout << delimiters[0];
}

我在gcc和clang之间得到了不同的答案

clang7.0.0打印出来,

gcc8.2.0给出了错误

  抛出'std :: length_error'实例后调用

terminate     what():无法创建大于max_size()的std :: vector

     

中止

哪个编译器正确?

1 个答案:

答案 0 :(得分:14)

两个编译器都是正确的,因为您的代码具有未定义的行为。

您陷入了陷阱。 { ",", ";" }被翻译为std::vector{const char*, const char*}。由于您有指针,因此它在语法上是有效的(因为它称为向量的迭代器构造函数),但是您使用的是两个无关的字符串文字的地址,该地址无效,因为迭代器必须指向同一容器。

要真正使用此功能,您真正需要的是使用字符文字,而不是像初始化程序列表中的字符串文字一样

std::vector<char> delimiters = { ',', ';' };