以下代码的正确行为是什么?
#include <vector>
#include <iostream>
int main()
{
std::vector<char> v = { "y", "z" };
std::cout << v[0];
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这不是一个未定义的行为吗?
P0W*_*P0W 10
在深入研究标准后,我发现以下内容:
在这里,我试图初始化vector<char> 使用两个字符串文字,而不是两个字符.使用vector(initializer_list<T>).在这种情况下,vector(initializer_list<char>).
但是字符串文字的类型是"n const char数组",因此初始化列表构造函数不匹配.
这不会导致编译器错误,因为编译器能够找到另一个匹配的构造函数
§13.3.1.71解释了规则:
"当非聚合类类型T的对象被列表初始化时,重载决策分两个阶段选择构造函数:
- 最初,候选函数是类T的初始化列表构造函数,参数列表由初始化列表作为单个参数组成[我们已经看到它们不匹配].
- 如果找不到可行的初始化列表构造函数,则再次执行重载解析,其中候选函数是类T的所有构造函数,参数列表由初始化列表的元素组成.
在这种情况下的匹配是:
template <class InputIterator> vector(InputIterator first, InputIterator last)
Run Code Online (Sandbox Code Playgroud)
该类型的InputIterator有没有资料T的vector<T>.所以,即使我正在初始化a vector<char>,这两个参数也可以是任意类型.唯一的要求是他们坚持InputIterator财产,这const char[]恰好.
构造函数认为它已经将两个迭代器传递给相同的序列,但它实际上已经将迭代器传递给两个完全不同的序列,"y"并且"z".
所以这个程序的结果是不确定的.
感谢克里斯的评论 这篇文章与他在那里提到的完全相同.看到这个
| 归档时间: |
|
| 查看次数: |
4555 次 |
| 最近记录: |