2014-09-28 3 views
5

C에서 ++ 규격 초안 N3337 : 다음decltype의 동작이 정의 된 이유는 무엇입니까?

7.1.6.2 간단한 형태 지정자

4 decltype(e) 가리키는 유형 정의된다

-e가 호로 -이지 ID-이면 표현 또는 괄호 안의 반원 멤버 액세스 (5.2.5) 인 경우 decltype(e)e이라는 이름의 엔티티 유형입니다. 그러한 엔티티가 없거나 e이 오버로드 된 함수 집합을 명명하면 프로그램이 잘못 구성됩니다.

- 그렇지 않으면 e가 x 값인 경우 decltype(e)T&&이고 Te 유형입니다.

- 그렇지 않으면 e가 lvalue 인 경우 decltype(e)T&이고 Te 유형입니다. 왜 decltype(*ap) 단지 int을 수 없었다, 설명 일부 문서에

내가 제대로 위를 이해한다면,

int a; 
decltype(a) b = 10; // type of b is int 

int* ap; 
decltype(*ap) c = 10; // Does not work since type of c is int& 

당신이 설명 할 수 또는 포인트?

+0

이미 알고 계시 겠지만, 레코드에 대해서는'std :: remove_reference' 또는'std :: remove_pointer'를 사용하여 수정할 수 있습니다. – 101010

+0

@ 40two, 네, 그 유틸리티에 대해 알고 있습니다. 저는 왜 언어가 그것이 정의 된 방식으로 정의되는지 이해하려고 노력하고 있습니다. –

+0

나는 당신이이 전제에서 보통 용의자이기 때문에 당신이 그것을 안다는 것을 알았습니다. 생각해 볼 수있는 주된 이유는 후행 반환에서'decltype '을 사용하기위한 것입니다. 형식에서'&'를 제거하면 내가 뒤 따르는 반환에 불편할 수 있습니다. – 101010

답변

6

decltype의 표준화 노력은 수년에 걸친 헤르쿨레스 노력이었다. 위원회가 마침내 그것을 받아들이 기 전에이 백서의 7 가지 버전이있었습니다. 버전은 있었다 :

놀랍게도, 당신이 질문 행동의 씨앗은 첫 번째 개정에 있습니다에 대한 필요성 소개 N1478, "대해서 typeof의 두 가지 유형 :. 중 보존 또는 유형에 대한 참조를 드롭"

이 논문이 인용을 포함하여 기준 보존 변형에 대한 이론적 근거, 제공하기 위해 계속 :

한편을 참조-떨어 의미는 정확하게 수익을 표현하기위한 메커니즘을 제공하지 Strouser [Str02]에 의해 설명 된 바와 같이 일반 함수의 유형입니다. 이는 참조 드롭 형식이 일반 라이브러리의 작성자에게 문제가 될 수 있음을 의미합니다.

이 글을 읽는 대신 사용할 수있는 것은 없습니다. 그러나 decltype은 두 가지 용도로 사용된다는 것을 요약 할 수 있습니다.

  1. 식별자의 선언 된 유형을보고합니다.
  2. 표현식의 유형을보고합니다.

두 번째 사용 사례의 경우 표현식은 절대로 참조 유형이 아니며 대신 lvalues, xvalues ​​또는 prvalues ​​중 하나임을 상기하십시오. 관례에 따라 decltype이 lvalue 표현식의 유형을보고하면 유형은 좌변 값 참조가되고, 표현식이 xvalue이면보고 된 유형은 rvalue 참조가됩니다.

예에서 *ap은 표현식 인 반면 a은 식별자입니다. 따라서 예제에서는 N1478에 처음 소개 된 두 가지 사용 사례를 모두 사용합니다.

decltype은 고립으로 설계되지 않았습니다. C++ 언어의 나머지 부분은이 기간 (예 : rvalue references) 동안 진화했으며, decltype의 디자인이 속도를 유지하기 위해 반복되었습니다.

decltype 제안서가 수락되면 계속 진행되며 오늘도 계속 진행됩니다. 문제의 목록을 참조하십시오 :

http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_index.html

특별히 섹션 7.1.6.2 (섹션입니다 어디 decltype 사양의 삶의 대부분).

관련 문제