// { dg-do compile { target c++17 } } #include #include #include struct X : private std::shared_ptr { std::string fun_payload; }; template std::string& get(X& x) { if constexpr(N==0) return x.fun_payload; } namespace std { template<> class tuple_size : public std::integral_constant {}; template<> class tuple_element<0, X> {public: using type = std::string;}; } struct X2 : private std::shared_ptr { int fun_payload; template void get(); }; template int& get(X2& x) { if constexpr(N==0) return x.fun_payload; } namespace std { template<> class tuple_size : public std::integral_constant {}; template<> class tuple_element<0, X2> {public: using type = int;}; } class X3 { double fun_payload; public: template double& get() { if constexpr(N==0) return fun_payload; } }; namespace std { template<> class tuple_size : public std::integral_constant {}; template<> class tuple_element<0, X3> {public: using type = double;}; } int main() { X x; auto& [b1] = x; X2 x2; auto& [b2] = x2; X3 x3; auto& [b3] = x3; }