聚合的值初始化是否使用其成员的默认初始化程序?

时间:2019-06-04 14:05:14

标签: c++

如果我有一个聚合结构,则为其成员使用默认的初始化程序。如果我对集合进行初始化,是用初始化程序初始化成员,还是对它们进行值初始化?

#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_typeFoo的值初始化是否使用我的默认初始化程序?程序是否保证输出1

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)。)这种构造形式,即firstsecond分别在单独的元组对象中提供,称为逐段构造

(请注意,Args2...在此处为空,因此没有为Foo提供构造函数参数,但是该机制仍然与构造函数用法相同)