2017-09-03 7 views
36

gcc와 clang이 non-type 템플릿 매개 변수 절에서 decltype(auto)을 사용할 수 있음을 발견했습니다. 예컨대 :C++에서 형식이 아닌 템플릿 매개 변수는 decltype (자동) 일 수 있습니까?

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

int foo ; 

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

[live demo gcc][live demo clang]

이 표준을 준수 기능입니다 또는 일부 GNU 확장이다?

+8

그래서 내가 늦게까지 머물러 있습니다. 그런 질문은 나를 언어에 대해 더 많이 배울 수있게 해준다. – StoryTeller

+7

@StoryTeller 나는 적어도 나를 위해, C++은 여전히 ​​놀라움으로 가득차 있다는 것을 인정한다. :) –

+1

아주 좋은 질문이다. +1 그리고, @ 이야기 텔러 : 나는 당신과 definetely 동의합니다. – skypjack

답변

28

이것은 표준입니다. 먼저, 비 형 템플릿 매개 변수 :

  • :

    [temp.param/4]

    비 형 템플릿 파라미터는 다음 (임의로 CV 수식) 유형 중 하나를 가진다. ..

  • 자리 표시 자 유형을 포함하는 유형입니다.

은 자리 표시 자 유형이 지정된 다음 한 경우 :

[dcl.spec.auto/1]

자동 및 decltype (자동) 입력 - 지정자는있을 것 자리 유형을 지정하는 데 사용됩니다 나중에 이니셜 라이저에서 공제하여 대체되었습니다. 자동 유형 지정자는 후행 반환 유형을 갖는 함수 유형을 소개하거나 람다가 일반 람다 ([expr.prim lambda.closure])임을 나타 내기 위해 사용됩니다. 자동 형식 지정자는 구조화 된 바인딩 선언을 소개하는데도 사용됩니다. [dcl.spec.auto/5]

플레이스 홀더 형

도로서 신형-ID 또는 새로운 표현의 유형 ID 및 에서 타입 지정-SEQ에 사용될 수있다 매개 변수 선언의 의 decl-specifier는 템플릿 매개 변수의 매개 변수 선언의 decl-specifier-seq입니다.

총알 위 "자리 유형"라고하고, 이러한 유형이 지정 될 수 있기 때문에 역시auto 또는 decltype(auto)으로 모두 정확 컴파일러.