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

时间:2014-11-10 05:22:31

标签: c++ c++11

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

#include <vector>
#include <iostream>

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

  return 0;
}

Clang已接受此项,但GCCVC++

不接受

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

1 个答案:

答案 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"

因此该程序的结果是 未定义

感谢克里斯的comment 这个帖子与他在那里提到的完全相同。请参阅this