如果我有一个聚合结构,则为其成员使用默认的初始化程序。如果我对集合进行初始化,是用初始化程序初始化成员,还是对它们进行值初始化?
#include <unordered_map>
#include <array>
#include <iostream>
struct Foo{
std::array<bool, 2> x = {true, true};
};
int main(){
std::unordered_map<int, Foo> f;
std::cout << f[0].x[1];
}
如果键不存在,则 unordered_map::operator[]
值初始化value_type
。 Foo
的值初始化是否使用我的默认初始化程序?程序是否保证输出1
?
答案 0 :(得分:2)
是的
地图的元素初始化将通过默认构造函数进行。
而且,对于my previous answer on the subject,这是您默认的初始化方法。
[unord.map.elem]:
mapped_type& operator[](const key_type& k);
1/ 效果:等同于:return try_emplace(k).first->second;
[unord.map]:
template<class... Args> pair<iterator, bool> try_emplace(const key_type& k, Args&&... args);
6/ 效果::如果地图已经包含其键与k
等效的元素,则没有效果。否则,将插入由value_type
构造的piecewise_construct, forward_as_tuple(k), forward_as_tuple(std::forward<Args>(args)...)
类型的对象。
[pairs]:
template<class... Args1, class... Args2> constexpr pair(piecewise_construct_t, tuple<Args1...> first_args, tuple<Args2...> second_args);
/15:效果:使用通过转发first
的元素而获得的类型Args1...
的参数初始化first_args
并使用参数初始化second
通过转发Args2...
的元素而获得的second_args
类型。 (这里,在x
对象中转发类型为U
的元素tuple
意味着调用std::forward<U>(x)
。)这种构造形式,即first
和second
分别在单独的元组对象中提供,称为逐段构造。
(请注意,Args2...
在此处为空,因此没有为Foo
提供构造函数参数,但是该机制仍然与构造函数用法相同)