2017-09-03 71 views
36

我发现gcc和clang允许在非类型模板参数类型子句中使用decltype(auto)。例如: -C++ 17中的非类型模板参数可以是decltype(auto)吗?

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

int foo ; 

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

[live demo gcc][live demo clang]

是否符合标准的功能或者是一些GNU扩展?

+8

这就是为什么我熬夜在SO。这样的问题是什么让我更多地了解自己的语言:) – StoryTeller

+7

@StoryTeller我承认,至少对我来说,C++仍然充满惊喜:) –

+1

非常好的问题。 +1,@StoryTeller:我同意你的定义。 – skypjack

回答

28

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

[temp.param/4]

甲非类型模板参数应具有下列 (任选CV修饰)类型之一:

  • 。 ..
  • 一种类型,其中包含一个占位符类型

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

[dcl.spec.auto/1]

自动和decltype(自动)类型说明符用来指定一个 占位符类型,这将是稍后从 初始值设定项中扣除。自动类型说明符还用于引入具有尾随返回类型的函数类型或表示 lambda是通用lambda([expr.prim.lambda.closure])。自动 类型说明符也用于引入结构化绑定 声明。

[dcl.spec.auto/5]

一个占位符类型也可以在 新型-ID或新表达式的类型-id和作为使用在类型说明符-SEQ decl-specifier 模板参数中的参数声明的decl-specifier-seq。

由于上面的子弹说“占位符类型”,并且这种类型可以被指定或者与autodecltype(auto),两个编译器的正确性。

相关问题