我之前看过这样的代码:
using A = std::vector<std::vector<T>...>
其中T
是模板参数的可变参数列表。我想知道将参数包放在最后一个尖括号的末尾和第一个尖括号之间有什么区别。例如:
using B = std::vector<std::vector<T...>>;
这两个编译都很好,但我不知道有什么区别。
有人可以解释一下吗?感谢。
答案 0 :(得分:23)
在包装展开中,对于包装的每个元素重复...
之前的模式,因此vector<T>...
表示扩展为vector<T1>, vector<T2>, vector<T3>
,而vector<T...>
表示展开为{ {1}}
如果参数包只有一个元素它们是相同的,但考虑参数包是否有两个元素,应该很明显
vector<T1, T2, T3>
和
std::vector<std::vector<T1>, std::vector<T2>>
不一样。第一个不会编译,std::vector<std::vector<T1, T2>>
的第二个模板参数必须是分配器类型,而不是矢量。如果std::vector
是分配器类型,则第二个将编译。
答案 1 :(得分:8)
实例化A<T1, T2, T3>
时,它会扩展为:
std::vector<std::vector<T1>, std::vector<T2>, std::vector<T3>>
使用相同的模板参数来实例化B
,您得到:
std::vector<std::vector<T1, T2, T3>>