Open 2b6a7eb7-d316-41f0-a774-6eb0f997b236 opened 6 years ago
This happens because tuple in the MSFT STL is defined recursively: tuple<First, Rest...>
is derived from tuple<Rest...>
. Consequently S
in the sample code is derived from tuple<int>
which derives from tuple<>
. Per the standard, the conversion from S
to tuple<>
is no worse than the conversion from S
to tuple<int>
- and both are valid conversion sequences when passing S
to std::get
- so the call is ambiguous. MSVC as an "extension" prefers the conversion from S
to tuple<int>
and thus non-conformingly resolves the call to std::get
as unambiguous.
C++ people, is this code supposed to work? I'm guessing the std::tuple
overload is supposed to be chosen and object slicing is supposed to occur, right?
Extended Description
Works for other compilers: https://godbolt.org/g/qABFqf