https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78939
Jakub Jelinek <jakub at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |NEW Last reconfirmed| |2016-12-28 CC| |jakub at gcc dot gnu.org, | |jason at gcc dot gnu.org, | |redi at gcc dot gnu.org Component|c++ |libstdc++ Summary|<tuple> interferes with |[C++17] <tuple> interferes |structured binding from |with structured binding |struct |from struct Ever confirmed|0 |1 --- Comment #1 from Jakub Jelinek <jakub at gcc dot gnu.org> --- That is a consequence of the recent P0490R0 GB 20 change and <utility> having: /// Finds the size of a given tuple type. template<typename _Tp> struct tuple_size; // _GLIBCXX_RESOLVE_LIB_DEFECTS // 2770. tuple_size<const T> specialization is not SFINAE compatible template<typename _Tp, typename = void> struct __tuple_size_cv_impl { }; template<typename _Tp> struct __tuple_size_cv_impl<_Tp, __void_t<decltype(tuple_size<_Tp>::value)>> : integral_constant<size_t, tuple_size<_Tp>::value> { }; // _GLIBCXX_RESOLVE_LIB_DEFECTS // 2313. tuple_size should always derive from integral_constant<size_t, N> template<typename _Tp> struct tuple_size<const _Tp> : __tuple_size_cv_impl<_Tp> { }; template<typename _Tp> struct tuple_size<volatile _Tp> : __tuple_size_cv_impl<_Tp> { }; template<typename _Tp> struct tuple_size<const volatile _Tp> : __tuple_size_cv_impl<_Tp> { }; http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2770 So, either the GB 20 change has been added without considering the effect on the existing <utility>, or there is some further <utility> change needed, or libstdc++ doesn't do what the DR requests. But the current DR wording talks about not having the value member, which is something GB 20 doesn't require any more.