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

时间:2017-09-03 19:48:22

标签: c++ templates language-lawyer c++17

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

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

int foo ;

int main() {
    X<(foo)> x;
    static_cast<void>(x);
}

[live demo gcc] [live demo clang]

是标准兼容功能还是某种gnu扩展?

1 个答案:

答案 0 :(得分:28)

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

[temp.param/4]

  

非类型模板参数应具有以下之一   (可选择cv-qualified)类型:

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

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

[dcl.spec.auto/1]

  

auto和decltype(auto)类型说明符用于指定a   占位符类型稍后将通过从中扣除来替换   初始化。 auto类型说明符也用于引入a   具有尾随返回类型的函数类型或表示a   lambda是一个通用的lambda([expr.prim.lambda.closure])。汽车   type-specifier还用于引入结构化绑定   声明。

[dcl.spec.auto/5]

  

也可以在类型说明符-seq中使用占位符类型   新表达式的new-type-id或type-id,以及作为decl-specifier   a中的参数声明的decl-specifier-seq   模板参数。

由于上面的子弹显示“占位符类型”,并且可以使用autodecltype(auto)指定此类型,因此两个编译器都是正确的。