用双花括号初始化 vector<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 = a\acke�Z\
c.c_str() = a
隐式转换中心。事情就是这样。
vector<string> v = {"a", "b"};
您通过提供包含 两个 元素的初始化列表来初始化向量。这两个 std::string
是从字符串文字初始化的,然后复制到向量中。
vector<string> v = {{"a", "b"}};
您通过提供带有 one 元素的初始化器来初始化向量。并且单个 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*
)。因为那些不是真正的迭代器,所以一切都乱七八糟。
谁能解释下例中使用双花括号和单花括号初始化的行为差异?
代码#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 = a\acke�Z\
c.c_str() = a
隐式转换中心。事情就是这样。
vector<string> v = {"a", "b"};
您通过提供包含 两个 元素的初始化列表来初始化向量。这两个std::string
是从字符串文字初始化的,然后复制到向量中。vector<string> v = {{"a", "b"}};
您通过提供带有 one 元素的初始化器来初始化向量。并且单个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*
)。因为那些不是真正的迭代器,所以一切都乱七八糟。