Почему нет кусочно-кортежной конструкции?

Стандартные шаблоны 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,...));

Есть ли причина, по которой это невозможно сделать?[ Редактировать:Или я совсем неправильно понимаю цель кусочного построения?]

(У меня действительно есть ситуация, в которой я хотел бы инициализировать вектор кортежей со значением элемента по умолчанию, которое я бы предпочел построить непосредственно из аргументов, не указывая каждый тип элемента кортежа снова.)

40
задан Kerrek SB 7 August 2012 в 13:49
поделиться