做vector <vector <T ... >>和vector <vector <T> ...>之间的区别是什么

Me *_*d I 13 c++ c++11

我之前看过这样的代码:

using A = std::vector<std::vector<T>...>
Run Code Online (Sandbox Code Playgroud)

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

using B = std::vector<std::vector<T...>>;
Run Code Online (Sandbox Code Playgroud)

这两个编译都很好,但我不知道有什么区别.

谁能解释一下?谢谢.

Jon*_*ely 23

在包装膨胀中...,对于包装的每个元件重复之前的图案,因此vector<T>...装置扩展到,vector<T1>, vector<T2>, vector<T3>vector<T...>装置扩展到vector<T1, T2, T3>

如果参数包只有一个元素它们是相同的,但考虑参数包是否有两个元素,应该很明显

std::vector<std::vector<T1>, std::vector<T2>>
Run Code Online (Sandbox Code Playgroud)

std::vector<std::vector<T1, T2>>
Run Code Online (Sandbox Code Playgroud)

不一样.第一个不会编译,第二个模板参数std::vector必须是分配器类型,而不是矢量.如果T2是分配器类型,则第二个将编译.


mfo*_*ini 8

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

std::vector<std::vector<T1>, std::vector<T2>, std::vector<T3>>
Run Code Online (Sandbox Code Playgroud)

使用相同的模板参数进行实例化B,您将获得:

std::vector<std::vector<T1, T2, T3>>
Run Code Online (Sandbox Code Playgroud)

  • @Praetorian你是对的.但是,我相信OP对参数包的扩展方式更感兴趣. (3认同)
  • 也不会编译 (2认同)