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

            Bug ID: 84283
           Summary: std::map::insert(const_iterator, P&&) now ambiguous
                    with std::map::insert(InputIterator, InputIterator)
           Product: gcc
           Version: 8.0
            Status: UNCONFIRMED
          Keywords: rejects-valid
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: redi at gcc dot gnu.org
  Target Milestone: ---

#include <map>

template<typename T>
struct map_type_to_map
#ifndef FIX
  : std::map<T, std::map<int, int>>
#endif
{
    void add( const std::map<int, int>& values ) {
        std::map<int, int> m, n;
        m.insert(n.cbegin(), n.cend());
    }
};

This fails to compile with trunk (unless FIX is defined):



map.cc: In member function ‘void map_type_to_map<T>::add(const std::map<int,
int>&)’:
map.cc:11:38: error: call of overloaded ‘insert(std::map<int,
int>::const_iterator, std::map<int, int>::const_iterator)’ is ambiguous
         m.insert(n.cbegin(), n.cend());
                                      ^
In file included from /home/jwakely/gcc/8/include/c++/8.0.1/map:61,
                 from map.cc:1:
/home/jwakely/gcc/8/include/c++/8.0.1/bits/stl_map.h:876:2: note: candidate:
‘std::map<_Key, _Tp, _Compare, _Alloc>::iterator std::map<_Key, _Tp, _Compare,
_Alloc>::insert(std::map<_Key, _Tp, _Compare, _Alloc>::const_iterator, _Pair&&)
[with _Pair = std::_Rb_tree_const_iterator<std::pair<const int, int> >;
<template-parameter-2-2> = <missing>; _Key = int; _Tp = int; _Compare =
std::less<int>; _Alloc = std::allocator<std::pair<const int, int> >]’
  insert(const_iterator __position, _Pair&& __x)
  ^~~~~~
/home/jwakely/gcc/8/include/c++/8.0.1/bits/stl_map.h:892:2: note: candidate:
‘void std::map<_Key, _Tp, _Compare, _Alloc>::insert(_InputIterator,
_InputIterator) [with _InputIterator =
std::_Rb_tree_const_iterator<std::pair<const int, int> >; _Key = int; _Tp =
int; _Compare = std::less<int>; _Alloc = std::allocator<std::pair<const int,
int> >]’
  insert(_InputIterator __first, _InputIterator __last)
  ^~~~~~

The use of std::enable_if as a default template argument now causes an
ambiguity, where it didn't previously.

Also here: https://bugzilla.redhat.com/show_bug.cgi?id=1542254

Reply via email to