使用两个字符串字面量构建一个 vector<int>。

12

对于以下程序:

#include <vector>
#include <iostream>

int main()
{
  std::vector<int> v = {"a", "b"};
  
  for(int i : v)
    std::cout << i << " ";   
}

clang 输出 97 0'a' 的 ASCII 值为 97,但我不完全理解输出的结果。

另一方面,gcc 抛出了一个异常:

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

我认为它在使用接受大小和默认值的两个参数的构造函数,其中大小是从字符串常量 "a" 的地址计算出来的。

如果程序形式正确,那么正确的行为是什么?这是代码


1
我认为"a""b"会隐式转换为const char *类型,编译器认为它们是一个char类型的范围,可以转换成int类型。 - François Andrieux
我想是这样的。我记得以前见过这个,我正在检查是否有重复。 - François Andrieux
完美,谢谢,我找不到一个。 - cigien
1
我在思考这个问题,它与此相关但并非重复。链接 - François Andrieux
显示剩余2条评论
1个回答

14
我认为它使用的是带有大小和默认值的两个参数构造函数。
不,它使用了取两个输入迭代器的构造函数。 "a" 和 "b" 可以降解为指针,这是有效的迭代器。作为到const char的指针(迭代器),被解引用的const char将被转换为int并添加为vector的元素。无论如何,该代码具有UB,因为"a"和"b"不引用有效范围,"b"从"a"不可达。

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