Libc++ implements the two standard constructors 1) 'tuple(tuple const&)' and 2) 'tuple(tuple&&)' as a single generic overload 'tuple(Tuple&&)'. This can cause a slight differences in overload resolution.
For example the call to 'tuple(tuple<...>{})' will first consider ctor #2. However if this constructor SFINAE's aware then ctor #1 should be considered.
Since libc++ only provides a single overload it will only consider #2. This breaks the following code:
Extended Description
Libc++ implements the two standard constructors 1) 'tuple(tuple const&)' and 2) 'tuple(tuple&&)' as a single generic overload 'tuple(Tuple&&)'. This can cause a slight differences in overload resolution.
For example the call to 'tuple(tuple<...>{})' will first consider ctor #2. However if this constructor SFINAE's aware then ctor #1 should be considered. Since libc++ only provides a single overload it will only consider #2. This breaks the following code:
std::tuple<int&>(std::tuple<int&&>(42));