Стандартные шаблоны std::pair
и std::array
являются особыми случаями std::tuple
, и разумно, что они должны иметь очень похожий набор возможностей.
Однако, однозначно среди трех, std::pair
допускает кусочную конструкцию. То есть, если типы T1
и T2
могут быть построены из набора аргументов a1, a2, ...
и b1, b2, ...
, то, с моральной точки зрения, мы можем сделать пару
"pair<T1, T2> p(a1, a2, ..., b1, b2, ...)"
непосредственно. Практически это объясняется примерно так:
std::pair<T1, T2> p(std::piecewise_construct,
std::forward_as_tuple(a1, a2, ...),
std::forward_as_tuple(b1, b2, ...));
Вопрос: Почему не существует одинаковой кусочной конструктивности для массивов и кортежей? Есть ли глубокая причина, или это простое упущение? Например, было бы неплохо иметь:
std::tuple<T1, T2, T3> t(std::piecewise_construct,
std::forward_as_tuple(a1, a2, ...),
std::forward_as_tuple(b1, b2, ...),
std::forward_as_tuple(c1, c2, ...));
Есть ли причина, по которой это невозможно сделать? [Edit: Или я полностью не понимаю цель кусочной конструкции?]
(У меня действительно есть ситуация, в которой я хотел бы инициализировать вектор кортежей с дефолтным значением элемента, который я бы предпочел бы построить непосредственно из аргументов, не повторяя каждый тип элемента tuple снова.)