以下代码的正确行为是什么?
#include <vector>
#include <iostream>
int main()
{
std::vector<char> v = { "y", "z" };
std::cout << v[0];
return 0;
}
不接受
这不是一个未定义的行为吗?
答案 0 :(得分:10)
在深入了解标准后,我发现了以下内容:
在这里,我尝试使用两个字符串文字初始化vector<char>
,而不是两个字符。
使用vector(initializer_list<T>)
。在这种情况下,vector(initializer_list<char>)
。
但字符串文字的类型是“n const char”的数组,因此初始化列表构造函数不匹配。
§13.3.1.7¶1解释了规则:
“当对象 非聚合类类型T是列表初始化的重载决策 选择两个阶段的构造函数:
- 最初是候选人 函数是类T的初始化列表构造函数 参数列表由初始化列表作为单个参数组成 [我们见过的不匹配]。
- 如果没有可行的初始化列表 找到构造函数,再次执行重载决策,其中 候选函数是T类和T类的所有构造函数 参数列表由初始化列表的元素组成。“
这种情况下的匹配是:
template <class InputIterator> vector(InputIterator first, InputIterator last)
InputIterator
的{{1}}类型T
中没有vector<T>
的信息。
所以,即使我正在初始化vector<char>
,这两个参数也可以是任意类型。
唯一的要求是他们坚持InputIterator
属性,const char[]
恰好。{/ p>
构造函数认为它已经将两个迭代器传递给相同的序列,
但它实际上已经将迭代器传递给两个完全不同的序列,"y"
和"z"
。
因此该程序的结果是 未定义 。