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



             Bug #: 57139

           Summary: std::tuple conversion constructor does the wrong

                    checks

    Classification: Unclassified

           Product: gcc

           Version: 4.8.0

            Status: UNCONFIRMED

          Severity: normal

          Priority: P3

         Component: libstdc++

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

        ReportedBy: vpozdya...@gmail.com





As per Std 20.4.2.1/14, the "template <class... UTypes> tuple(const

tuple<UTypes...>& u)" constructor should require "is_constructible<Ti, const

Ui&>". However, the implementation checks "is_convertible<const _UElements&,

_Elements>", which implies copy constructibility requirement for destination

types. As a result:



#include <type_traits>

#include <tuple>



class A {  };

class B { public: B( A const &a ) {  } private: B( B const & ); };

static_assert( std::is_constructible< B, A const & >::value, "test" ); // OK

static_assert( std::is_convertible< A, B >::value, "test" ); // fail

static_assert( std::is_constructible< std::tuple<B>, std::tuple<A> >::value,

"test" ); // fail

Reply via email to