使用字符串文字初始化vector <char>

P0W*_*P0W 10 c++ c++11

以下代码的正确行为是什么?

#include <vector>
#include <iostream>

int main() 
{
  std::vector<char> v = { "y", "z" };  
  std::cout << v[0];

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是被接受Clang但不是GCCVC++

这不是一个未定义的行为吗?

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有没有资料Tvector<T>.所以,即使我正在初始化a vector<char>,这两个参数也可以是任意类型.唯一的要求是他们坚持InputIterator财产,这const char[]恰好.

构造函数认为它已经将两个迭代器传递给相同的序列,但它实际上已经将迭代器传递给两个完全不同的序列,"y"并且"z".

所以这个程序的结果是不确定的.

感谢克里斯的评论 这篇文章与他在那里提到的完全相同.看到这个