https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70511
Bug ID: 70511 Summary: tuple constructor from elements hides copy constructor Product: gcc Version: 6.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: libstdc++ Assignee: unassigned at gcc dot gnu.org Reporter: ivan.lelann at free dot fr Target Milestone: --- This code compiles fine : #include <iostream> #include <tuple> #include <boost/any.hpp> int main() { boost::any val = 12.0; std::tuple<boost::any> tuple_test {val}; std::cout << std::get<0>(tuple_test).type().name() << std::endl; std::tuple<boost::any> tuple_test_copy {tuple_test}; std::cout << std::get<0>(tuple_test_copy).type().name() << std::endl; } and prints : d St5tupleIJN5boost3anyEEE Because tuple_test_copy is not copy constructed. It is contructed from element, with implicit conversion to boost::any. https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/include/std/tuple#L621 My guess it that the forwarding constructor link above here hides copy constructor, becauses it hides the fact that a conversion will ultimately happen.