c ++ 17中的非types模板参数可以是decltype(auto)吗?
我发现gcc和clang允许在非types的模板参数types子句中使用decltype(auto)
。 例如:
template <decltype(auto)> struct X {}; int foo ; int main() { X<(foo)> x; static_cast<void>(x); }
[现场演示gcc] [现场演示铿锵]
它是标准兼容的function,还是一些GNU扩展?
这是标准的。 首先,对于非types的模板参数:
[temp.param / 4]
非types的模板参数应该具有以下(可选的cv-qualified)types之一:
- …
- 一个包含占位符types的types 。
凡占位符types具有以下指定:
[dcl.spec.auto/1]
自动和decltype(自动)types说明符用于指定一个占位符types ,稍后将从初始值设定项中扣除。 自动types说明符还用于引入具有尾随返回types的函数types或表示lambda是通用lambda([expr.prim.lambda.closure])。 自动types说明符也用于引入结构化绑定声明。
[dcl.spec.auto/5]
占位符types也可以在new-type的new-type-id或type-id中使用 , 也可以 在模板中作为参数声明的decl-specifier-seq的decl-说明符,参数。
由于上面的项目符号表示“占位符types”,并且这种types可以用auto
或decltype(auto)
来指定,所以两个编译器都是正确的。