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



             Bug #: 56112

           Summary: [4.8 Regression] cannot create unordered_map from

                    range of types convertible to value_type

    Classification: Unclassified

           Product: gcc

           Version: 4.8.0

            Status: UNCONFIRMED

          Keywords: rejects-valid

          Severity: normal

          Priority: P3

         Component: libstdc++

        AssignedTo: unassig...@gcc.gnu.org

        ReportedBy: r...@gcc.gnu.org





#include <unordered_map>



struct S

{

    operator std::pair<const int, int>() const { return {}; }

};



int main()

{

    S s[1];

    std::unordered_map<int, int> m(s, s+1);   // error



    std::pair<const int, int> p = *s;  // OK

    m.insert(s, s+1);  // OK

}





This is valid (value_type is EmplaceConstructible into the container from s[0])

but it fails to compile because of the change to use std::__detail::_Select1st

instead of std::_Select1st<value_type>



The template argument for _Select1st::operator() cannot be deduced from the

object of type S. The problem boils down to this:



#include <utility>



struct S

{

    operator std::pair<const int, int>() const { return {}; }

};



void f()

{

    S s;

    std::get<0>(s);

}



This is not valid, but the range constructors of unordered_map and

unordered_multimap assume using std::get<0> on the iterator's value type will

work, which is not a valid assumption.

Reply via email to