使用双花​​括号初始化vector <string>

Shi*_*hir 4 c++ constructor initialization-list

有人能解释下面例子中用双花括号和单花括号初始化之间的行为差​​异吗?

代码#1:

vector<string> v = {"a", "b"};
string c(v[0] + v[1]);
cout << "c = " << c;
cout << "c.c_str() = " << c.c_str();
Run Code Online (Sandbox Code Playgroud)

输出#1:

c = ab
c.c_str() = ab
Run Code Online (Sandbox Code Playgroud)

代码#2:

vector<string> v = {{"a", "b"}};
string c(v[0] + v[1]);
cout << "c = " << c;
cout << "c.c_str() = " << c.c_str();
Run Code Online (Sandbox Code Playgroud)

输出#2:

c = a\acke?Z\ 
c.c_str() = a
Run Code Online (Sandbox Code Playgroud)

Sto*_*ica 9

隐含转换中心.这是正在发生的事情.

  1. vector<string> v = {"a", "b"};通过提供包含两个元素的初始化列表来初始化向量.两个std::strings从字符串文字初始化,然后复制到向量中.

  2. vector<string> v = {{"a", "b"}};通过提供具有一个元素的初始化程序来初始化向量.并且这个单元std::string是从具有两个元素的初始化器初始化的.访问向量的第二个元素具有未定义的行为.

现在,这是有趣的部分.您的第二个片段甚至在您访问之前都有未定义的行为v[1].重载决策(构造单个std::string)选择一个构造函数.最好的可行的是:

template< class InputIt >
basic_string( InputIt first, InputIt last, 
              const Allocator& alloc = Allocator() );
Run Code Online (Sandbox Code Playgroud)

与InputIt被推导出char const [2](和功能参数调节,它转向char const*).因为那些不是真正的迭代器,所有的地狱都破裂了.

  • 请参阅/sf/ask/3266614011/ 也许你可以解释其中的区别 (2认同)