【问题标题】:different behavior between gcc and clang in such code此类代码中 gcc 和 clang 之间的不同行为
【发布时间】:2018-10-10 17:15:49
【问题描述】:
int main() 
{
    std::vector<char> delimiters = { ",", ";" };  
    std::cout << delimiters[0];
}

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

clang7.0.0 打印出来,

gcc8.2.0 报错

在抛出 'std::length_error' 的实例后调用终止 what(): 无法创建大于 max_size() 的 std::vector

中止

哪个编译器是正确的?

【问题讨论】:

  • std::vector&lt;char&gt; delimiters = { ",", ";" }; - 引号类型错误。
  • 两者都是正确的。这是未定义的行为。

标签: c++ gcc vector initialization clang


【解决方案1】:

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

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

让这个工作真正需要的是使用字符文字,而不是初始化列表中的字符串文字

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-23
    • 2017-10-09
    • 1970-01-01
    • 2015-10-06
    • 1970-01-01
    • 2014-04-11
    • 2022-12-14
    • 1970-01-01
    相关资源
    最近更新 更多