2017-09-03 62 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),兩個編譯器的正確性。

相關問題