Какая разница между выполнением vector <vector <T... >> и vector <vector <T>...> - программирование

Какая разница между выполнением vector <vector <T... >> и vector <vector <T>...>

Я видел такой код раньше:

using A = std::vector<std::vector<T>...>

где T - вариационный список аргументов шаблона. Я хотел знать, в чем разница между установкой пакета параметров в конце последней угловой скобки и первой. Например:

using B = std::vector<std::vector<T...>>;

Оба эти двух компилируются отлично, но я не знаю, в чем разница.

Может кто-нибудь объяснить? Спасибо.

4b9b3361

Ответ 1

В расширении пакета шаблон, предшествующий значению ..., повторяется для каждого элемента пакета, поэтому vector<T>... означает расширение в vector<T1>, vector<T2>, vector<T3>, тогда как vector<T...> означает расширение в vector<T1, T2, T3>

Если пакет параметров имеет только один элемент, они одинаковы, но рассмотрим, есть ли в пакете параметров два элемента, должно быть очевидно, что

std::vector<std::vector<T1>, std::vector<T2>>

и

std::vector<std::vector<T1, T2>>

не совпадают. Первый не будет компилироваться, вторым параметром шаблона для std::vector должен быть тип распределителя, а не вектор. Второй будет компилироваться, если T2 - тип распределителя.

Ответ 2

При создании экземпляра A<T1, T2, T3> он расширяется до:

std::vector<std::vector<T1>, std::vector<T2>, std::vector<T3>>

Используя те же аргументы шаблона для создания экземпляра B, вы получаете:

std::vector<std::vector<T1, T2, T3>>