“vector<vector<T...>>”和“vector<vector<T>...>”有什么区别?

13

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

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

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

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

这两个都可以编译通过,但我不知道它们之间有什么区别。

能有人解释一下吗?谢谢。

2个回答

23
在扩展包(pack expansion)中,位于...之前的模式(pattern)将针对pack中的每个元素进行重复,因此vector<T>...表示扩展为vector<T1>, vector<T2>, vector<T3>vector<T...>则表示扩展为vector<T1, T2, T3>
如果参数包(parameter pack)只有一个元素,则它们相同,但是考虑如果参数包有两个元素,则很明显它们是不同的。
std::vector<std::vector<T1>, std::vector<T2>>

并且

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

两者不同。第一个不能编译,第二个模板参数必须是分配器类型,而不是向量类型std::vector。如果T2是分配器类型,则第二个将编译通过。


8

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

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

使用相同的模板参数来实例化B,您会得到以下结果:
std::vector<std::vector<T1, T2, T3>>

3
@ Praetorian 你是正确的。然而,我认为OP更关心参数包的展开方式。 - mfontanini

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接