2017-09-03 22 views
36

Odkryłem, że gcc i clang umożliwiają użycie decltype(auto) w klauzuli typu parametru typu non-type. Np .:Czy parametry szablonu bez wpisu w języku C++ 17 to decltype (auto)?

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

int foo ; 

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

[live demo gcc][live demo clang]

Czy to standardowa funkcja zgodna, czy jest to jakiś gnu rozszerzenie?

+8

Dlatego nie spóźniam się na SO. Takie pytania sprawiają, że sama uczę się więcej o tym języku :) – StoryTeller

+7

@StoryTeller Przyznaję, że przynajmniej dla mnie C++ nadal jest pełen niespodzianek :) –

+1

Bardzo ładne pytanie. +1 i @StoryTeller: Zgadzam się z Tobą zdecydowanie. – skypjack

Odpowiedz

28

To jest standard. Po pierwsze, dla nie typu parametru szablonu:

[temp.param/4]

Non typu szablonu parametrów ma jedno z następujących typów (ewentualnie cv wykwalifikowany)

  • . ..
  • Typ zawierający typ zastępczy .

Gdzie typy zastępcze mają następujące określone: ​​

[dcl.spec.auto/1]

auto i decltype (auto) Type-Specyfikatory wykorzystywane są do wyznaczenia typu zastępczy, który będzie zastąpiony później przez odjęcie od inicjalizatora . Specyfikator typu auto jest również używany do wprowadzenia funkcji typu z typem powrotu z powrotem lub do zasygnalizowania, że ​​lambda jest ogólną wartością lambda ([expr.prim.lambda.closure]). Specyfikator typu auto jest również używany do wprowadzenia deklaracji strukturyzowanego wiązania.

[dcl.spec.auto/5]

typ zastępczy może być również stosowany w typu specyfikatora-seq w nowego typu-id lub typu identyfikator nowej ekspresji i postaci specyfikator decl z parametr decl-specifier-seq deklaracji parametru w parametrze-szablonie .

Ponieważ kula powyżej mówi „typ zastępczy”, a taki typ może być oznaczony albo z auto lub decltype(auto) oba kompilatory są poprawne.