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

Are template template template parameters an extension or part of the standard?

本文关键字:一部分 标准 扩展 参数      更新时间:2023-10-16

我正在寻找与模板模板参数相关的其他内容,并偶然发现了这个答案,该答案声称标准不允许模板模板模板参数。

但是,以下代码在最新的 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;

这是一个扩展,还是另一个答案实际上是不正确的,并且是标准允许的?如果不是,遗漏有什么特别的原因吗?

std::vector<int>类模板std::vector将类型int作为参数传递。在std::get<42>(some_tuple)中,函数模板std::get的值42作为参数传递。也许难以想象的是,前一种参数称为模板的类型参数(或模板类型参数),而后一种是(模板)非类型参数。

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

由于C++中没有模板模板这样的东西(有类、函数和别名模板 - 但它们无论如何都只是"模板"),因此没有模板模板模板参数这样的东西。您拥有的是工厂模板模板参数的运行,其中预期的模板参数本身具有模板模板参数。我在标准中找不到禁止这样做的参考资料,例如您链接的答案。