https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86852

            Bug ID: 86852
           Summary: map and unordered_map wrong deduction guides for
                    inilializer_list
           Product: gcc
           Version: 9.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: libstdc++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: mickey.veksler at gmail dot com
  Target Milestone: ---

According to
https://en.cppreference.com/w/cpp/container/unordered_map/deduction_guides

Deduction guides for unodrered_map:
template<class Key, class T, class Hash = std::hash<Key>,
         class Pred = std::equal_to<Key>,
         class Alloc = std::allocator<std::pair<const Key, T>>>
unordered_map(std::initializer_list<std::pair<const Key, T>>,
         typename /*see below*/::size_type = /*see below*/,
         Hash = Hash(), Pred = Pred(), Alloc = Alloc())
-> unordered_map<Key, T, Hash, Pred, Alloc>;


Note that the guide is for std::pair<const Key, T>, i.e., the key is const.
In libstdc++'s unodered_map:

    unordered_map(initializer_list<pair<_Key, _Tp>>,
                  typename unordered_map<int, int>::size_type = {},
                  _Hash = _Hash(), _Pred = _Pred(), _Allocator = _Allocator())
    -> unordered_map<_Key, _Tp, _Hash, _Pred, _Allocator>;


Note that pair<_Key, _Tp>, i.e., the key is not const.

This breaks unordered_map and map deduction guides:
  #include <unordered_map>
  #include <initializer_list>
  int main() {
     std::unordered_map m1(std::initializer_list<
                          std::pair<const int, int>>({{1, 2}, {2, 3}}));
  }

This fails with:
<source>: In function 'int main()':

<source>:5:69: error: class template argument deduction failed:

                         std::pair<const int, int>>({{1, 2}, {2, 3}}));




However, if const is removed from the key:
This breaks unordered_map and map deduction guides:
  #include <unordered_map>
  #include <initializer_list>
  int main() {
     std::unordered_map m1(std::initializer_list<
                          std::pair< int, int>>({{1, 2}, {2, 3}}));
  }

Deduction guide works, but it is unusable:
<source>: In function 'int main()':

<source>:5:64: error: no matching function for call to 'std::unordered_map<int,
int>::unordered_map(std::initializer_list<std::pair<int, int> >)'

                         std::pair< int, int>>({{1, 2}, {2, 3}}));

=====================
The only way to make this work in gcc is
   std::unordered_map m{std::pair<int, int>{1,2}, {3,4}};

But this does not seem to be correct.

Reply via email to