gcc和clang在这段代码中表现不同

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

我在使用gcc和clang编译时得到了不同的结果

clang7.0.0 输出:

gcc8.2.0 报错如下:

terminate called after throwing an instance of 'std::length_error' what(): cannot create std::vector larger than max_size()

Aborted

哪个编译器是正确的?


2
std::vector<char> delimiters = { ',', ';' }; - 引号类型错误。 - user2100815
两种都是正确的。这是未定义的行为。 - n. m.
1个回答

14

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

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

要使其正常工作,您真正需要做的是在初始化列表中使用字符字面值,而不是字符串字面值,例如:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接