<string> 使用双花括号初始化向量
Initializing vector<string> with double curly braces
有人可以解释以下示例中使用双大括号和单大括号初始化之间的行为差异吗?
代码 #1:
vector<string> v = {"a", "b"};
string c(v[0] + v[1]);
cout << "c = " << c;
cout << "c.c_str() = " << c.c_str();
输出 #1:
c = ab
c.c_str() = ab
代码 #2:
vector<string> v = {{"a", "b"}};
string c(v[0] + v[1]);
cout << "c = " << c;
cout << "c.c_str() = " << c.c_str();
输出 #2:
c = aacke�Z
c.c_str() = a
隐式转换中心。这就是正在发生的事情。
-
vector<string> v = {"a", "b"};
通过提供包含两个元素的初始值设定项列表来初始化向量。两个std::string
从字符串文本初始化,然后复制到向量中。 -
vector<string> v = {{"a", "b"}};
通过为初始值设定项提供一个元素来初始化向量。单个std::string
是从具有两个元素的初始值设定项初始化的。访问向量的第二个元素具有未定义的行为。
现在,这是有趣的部分。您的第二个代码段甚至在您访问 v[1]
之前就具有未定义的行为。重载分辨率(构造单个std::string
)选取构造函数。最可行的是:
template< class InputIt >
basic_string( InputIt first, InputIt last,
const Allocator& alloc = Allocator() );
InputIt
被推导出为char const [2]
(和函数参数调整,将其转换为char const*
)。由于这些不是真正的迭代器,所以所有的地狱都松动了。
相关文章:
- 如何使用C++初始化向量;脚本化值不是数组、指针或矢量错误
- 在C++中初始化向量映射的最有效方法
- 我使用向量来创建类对象列表.初始化向量时如何使用参数调用构造函数?
- 用向量的向量元素初始化向量的空向量
- 初始化向量数组,其中每个向量的大小为 0
- 如何初始化向量<unordered_map<*,*>>
- 如何在元组初始化向量中删除样板?
- C++ 通过函数声明后初始化向量
- 特征::向量;在函数中使用 Eigen::Matrix3f 的值初始化向量,大于 4 个条目
- 使用所述填充构造函数初始化向量中的向量
- 制作可用于初始化向量的迭代器
- 如何使用sregex_token_iterator对象初始化向量
- 用空向量 c++ 的 M 元素初始化向量
- 用reference_wrapper本地初始化向量
- 将向量元素与字符串元素进行比较,而不初始化向量
- 使用 reference_wrappers 初始化向量
- 从不同类型的容器的迭代器初始化向量
- 在具有容量/调整大小的类中初始化向量
- 在头文件中声明和初始化向量
- 错误:调用'begin(long double [nPoints])'没有匹配函数;使用硬编码的 int 与整数变量初始化向量