对于以下程序:
#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()
所以我假设它使用了2参数构造函数,该构造函数接受大小和默认值,其中大小是从字符串文本“a”
的地址计算的。
如果程序格式良好,正确的行为是什么? 这是密码。
我假设它使用的是2参数构造函数,它接受大小和默认值
不,它使用的构造函数有两个输入迭代器。 “A”
和“B”
可以衰减到作为有效迭代器的指针。 作为指向char
的指针(迭代器),取消引用的char
将被转换为int
,并添加为vector
的元素。 总之,代码具有UB,因为“A”
和“B”
不引用有效范围。