做vector<vector<T...>>和vector<vector...有什么区别<T>>

What's the difference between doing vector<vector<T...>> and vector<vector<T>...>

本文关键字:vector lt gt 区别 什么      更新时间:2023-10-16

我之前看到过这样的代码:

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

,其中T是模板参数的可变列表。我想知道把参数包放在最后一个尖括号的末尾和第一个尖括号的末尾有什么区别。例如:

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

这两个都可以编译,但我不知道有什么区别。

谁能解释一下?谢谢。

在包扩展中,...之前的模式对于包的每个元素都是重复的,因此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的第二个模板形参必须是分配器类型,而不是vector类型。如果T2是分配器类型,则第二个将编译。

实例化A<T1, T2, T3>时,扩展为:

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

使用相同的模板参数实例化B,可以得到:

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