13

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

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

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

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

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

有人可以解释吗?谢谢。

4

2 回答 2

23

在包扩展中,...对于包的每个元素重复前面的模式,因此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>>

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

于 2013-05-05T16:16:54.163 回答
8

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

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

使用相同的模板参数来实例化B,你会得到:

std::vector<std::vector<T1, T2, T3>>
于 2013-05-05T16:17:07.540 回答