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可以用autodecltype(auto)来指定,所以两个编译器都是正确的。