模板模板模板参数是扩展还是标准的一部分?

cel*_*rel 9 c++ templates template-templates

我正在寻找别的东西与模板模板参数和偶然发现这个答案谓其模板模板模板参数标准允许.

但是,以下代码在最新的clang(3.2)和最新的GCC(4.8)中编译:

template<template<template<typename> class> class T> struct test {};
template<template<typename> class T> struct foo {};
test<foo> bar;
Run Code Online (Sandbox Code Playgroud)

这是一个扩展,还是其他答案实际上是错误的并且标准允许?如果没有,是否有任何特殊原因遗漏?

Luc*_*ton 8

std::vector<int>类模板std::vector中传递类型int作为参数.在std::get<42>(some_tuple),函数模板作为参数std::get传递值42.也许unimaginatively前一种说法叫做模板(或模板类型参数)的类型参数,而后者一种是(模板)非类型参数.

但模板也可以接受另一种参数:其他模板.例如,template<template<typename> class T> void foo();声明一个以模板为参数的函数模板,它本身采用一个类型参数.(注意,虽然模板不是类型,但术语'非类型参数'仍然不包括模板模板参数.它保留给像template<int NonTypeArgument>.这样的参数.)

由于在C++中没有模板模板这样的东西(有类,函数和别名模板 - 但它们无论如何都只是'模板'),因此没有模板模板模板参数这样的东西.你所拥有的是一个磨损模板模板参数,其中预期的模板参数本身有一个模板模板参数.我无法在标准中找到禁止此内容的参考,例如您链接声明的答案.