Преобразование из std::tuple‹T, U› в std::pair‹T, U›

И 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 вызывается?


person Tristan Brindle    schedule 16.06.2015    source источник