c ++ 17中的非类型模板参数可以是decltype(auto)吗?

W.F*_*.F. 40 c++ templates language-lawyer c++17

我发现gcc和clang允许decltype(auto)在非类型模板参数类型子句中使用.例如:

template <decltype(auto)>
struct X {};

int foo ;

int main() {
    X<(foo)> x;
    static_cast<void>(x);
}
Run Code Online (Sandbox Code Playgroud)

[现场演示gcc] [现场演示铿锵]

它是标准兼容功能还是一些gnu扩展?

Sto*_*ica 29

这是标准的.首先,对于非类型模板参数:

[temp.param/4]

非类型模板参数应具有以下之一(可选的cv限定)类型:

  • ...
  • 包含占位符类型的类型.

占位符类型具有以下指定的位置:

[dcl.spec.auto/1]

auto和decltype(auto)类型说明符用于指定占位符类型,稍后将通过从初始值设定项中进行推导来替换该占位符类型.auto类型说明符还用于引入具有尾随返回类型的函数类型或表示lambda是通用lambda([expr.prim.lambda.closure]).auto类型说明符还用于引入结构化绑定声明.

[dcl.spec.auto/5]

占位符类型也可以在new-expression的new-type-id或type-id中的type-specifier-seq中使用,也可以在模板中作为参数声明的decl-specifier-seq的decl-specifier使用 -参数.

由于上面的子弹说"占位符类型",并且这种类型可以用auto或指定decltype(auto),两个编译器都是正确的.