Both GCC and Clang (or rather libstdc++ and libc++ respectively) agree that
std::is_convertible<std::pair<int, int>, std::tuple<int, int>>::value
is true, which one should expect since std::tuple<T, U> has a non-explicit constructor taking a pair.
Going in the other direction however, from a tuple to a pair, the implementations disagree:
static_assert(std::is_convertible<std::tuple<int, int>, std::pair<int, int>>::value,
"Cannot convert from tuple to pair");
fails with GCC but passes with Clang. I notice that std::pair has no constructor taking a tuple.
Questions:
According to the letter of the law, should the latter implicit conversion be allowed, or not? i.e. which implementation is correct here?
When calling
std::pair<int, int> p = std::make_tuple(3, 4);under Clang, whichstd::pairconstructor is being called?