И GCC, и Clang (или, скорее, libstdc++ и libc++ соответственно) согласны с тем, что
std::is_convertible<std::pair<int, int>, std::tuple<int, int>>::value
является true
, чего и следовало ожидать, поскольку std::tuple<T, U>
имеет неявный конструктор, принимающий pair
.
Однако если двигаться в другом направлении, от tuple
к pair
, реализации расходятся:
static_assert(std::is_convertible<std::tuple<int, int>, std::pair<int, int>>::value,
"Cannot convert from tuple to pair");
терпит неудачу с GCC, но проходит с Clang. Я заметил, что у std::pair
нет конструктора, принимающего tuple
.
Вопросы:
По букве закона должно ли быть разрешено последнее неявное преобразование или нет? то есть какая реализация здесь правильная?
При вызове
std::pair<int, int> p = std::make_tuple(3, 4);
в Clang какой конструкторstd::pair
вызывается?