Тип элемента std::map
и std::unordered_map
равен std::pair
. Проблема в том, что std::pair
имеет шаблонный конструктор,
template< class U1, class U2 >
constexpr pair( U1&& x, U2&& y );
Инициализирует first
с std::forward<U1>(x)
и second
с std::forward<U2>(y)
.
Например, если {33.3, 54}
, U1
выводится как double
, а U2
выводится как int
, обратите внимание, что это точное совпадение, и для использования этого конструктора при построении std::pair
не требуется никаких преобразований. , то и сужения не происходит.
С другой стороны, для std::set
, с учетом std::set<int> s {33.3};
, будет использован конструктор std::set
, принимающий std::initializer_list<int>
, и std::initializer_list<int>
будет инициализирован с {33.3}
происходит узкое преобразование.