http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59969

            Bug ID: 59969
           Summary: std::pair nonstandard constructor interferes when
                    calling map::emplace with noncopyable nonmovable
                    object
           Product: gcc
           Version: 4.8.2
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: libstdc++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: gcc.gnu.org.49489...@oli-obk.de

Created attachment 31968
  --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=31968&action=edit
example that cannot be built due to the bug

see also:
http://stackoverflow.com/questions/21405674/why-do-i-need-to-use-piecewise-construct-in-mapemplace-for-single-arg-construc

the issue is that on construction of the pair, the nonstandard constructor

// DR 811.
template<class _U1,
         class = typename enable_if<is_convertible<_U1, _T1>::value>::type>
constexpr pair(_U1&& __x, const _T2& __y)
: first(std::forward<_U1>(__x)), second(__y) { }

 is preferred over the standard constructor

template<class _U1, class _U2,
         class = typename enable_if<__and_<is_convertible<_U1, _T1>,
                                           is_convertible<_U2, _T2>
                                          >::value
                                   >::type>
constexpr pair(_U1&& __x, _U2&& __y)
: first(std::forward<_U1>(__x)), second(std::forward<_U2>(__y)) { }

Reply via email to