模板模板模板参数是扩展还是标准的一部分
Are template template template parameters an extension or part of the standard?
我正在寻找与模板模板参数相关的其他内容,并偶然发现了这个答案,该答案声称标准不允许模板模板模板参数。
但是,以下代码在最新的 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++中没有模板模板这样的东西(有类、函数和别名模板 - 但它们无论如何都只是"模板"),因此没有模板模板模板参数这样的东西。您拥有的是工厂模板模板参数的运行,其中预期的模板参数本身具有模板模板参数。我在标准中找不到禁止这样做的参考资料,例如您链接的答案。
相关文章:
- C++11 标准中的哪一部分规定了基元数据类型大小之间的相对顺序?
- 从另一个常量标准::映射初始化一个常量标准::映射的一部分
- 为什么std :: nullopt_t的一部分是C 标准的一部分
- 标准的哪一部分决定了现场成员与初始化器列表的优先级
- 虚拟表是C++标准的一部分吗?
- C 标准的哪一部分涵盖通过空指针调用方法
- fabsf 是 C++11 中标准命名空间的一部分吗?
- 内联asm是ANSI C标准的一部分吗
- C 标准的哪一部分要求set ::擦除呼叫灾难源
- 是标准的一部分
- 模板类方法不会导致错误——这是标准的一部分
- strcpy_s是C++标准的一部分吗?或者只是MS Visual C++的一部分
- 模板模板模板参数是扩展还是标准的一部分
- 线程是标准C++的一部分
- "polymorphic base class"是C++标准的一部分吗?
- 值初始化是 C++98 标准的一部分吗?如果不是,为什么在 C++03 标准中添加它
- wcslen 是 ISO/IEC 14882:2003 C++标准库的一部分吗?
- #import C++11 标准的一部分
- boost Range库将成为下一个c++标准的一部分吗?
- 模板模板参数何时成为标准的一部分?