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: [email protected]
ReportedBy: [email protected]
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