선언형
decltype C++프로그래밍 언어로decltype표현식의 유형을 쿼리하는 데 사용되는 키워드 입니다.C++11에 소개된 이 제품의 주요 용도는 템플릿 매개변수에 의존하는 유형을 표현하는 것이 종종 어렵거나 심지어 불가능한 일반적인 프로그래밍에 있다.
1990년대 내내 일반적인 프로그래밍 기법이 점점 인기를 끌면서, 형식적 통합 메커니즘의 필요성이 인정되었다.많은 컴파일러 벤더가 일반적으로 불리는 자체 버전의 운영자를 구현했다.typeof, 그리고 기존의 언어 기능에 기초하여 제한된 기능을 가진 일부 휴대용 구현이 개발되었다.2002년에 Bjarne Strustrup은 사업자의 표준화된 버전을 C++ 언어에 추가할 것을 제안하였고, 사업자가 표현식의 "선언된 유형"을 산출할 것을 반영하여 "선언형"이라는 명칭을 제안했다.
decltype의 의미론은 일반 도서관 작가와 초보 프로그래머 모두에게 적합하도록 고안되었다.일반적으로 추론된 유형은 소스 코드에 선언된 개체나 기능의 유형과 정확히 일치한다.Like thatsizeof[1] 연산자,decltype의 피연산자는 평가되지 않는다.
동기
C++ 프로그래밍 언어에 템플릿이 도입되고, 표준 템플릿 라이브러리에 의해 개척된 일반적인 프로그래밍 기법의 출현과 함께, 일반적으로 언급되는 표현식의 유형을 얻기 위한 메커니즘이 필요하게 되었다.typeof는 인정을 받았다.일반 프로그래밍에서 템플릿 파라미터, [2][3]특히 기능 템플릿 인스턴스화의 반환 형식에 의존하는 유형을 표현하는 것은 종종 어렵거나 불가능하다.[2]
많은 공급업체가typeof컴파일러 확장자로 연산자.[4]C++가 완전히 표준화되기 전인 1997년 초에 브라이언 파커는 이 기술을 바탕으로 한 휴대용 솔루션을 제안했다.sizeof교환원의[4]그의 작품은 빌 기븐스에 의해 확장되었는데, 빌 기븐스는 이 기법이 여러 가지 한계를 가지고 있고, 일반적으로 실제 기법보다 힘이 약하다고 결론지었다.typeof 기계 [4]장치안드레이 알렉산드레스쿠는 2000년 10월 닥터 도브스 저널 기고문에서 "유형적인 유형을 갖는 것은 템플릿 코드를 쓰고 이해하는 것을 훨씬 더 쉽게 만들 것"[5]이라고 말했다.그는 또한 "사이즈는 어쨌든 유형을 계산해야 하기 때문에 같은 백엔드를 공유한다"[5]고 언급했다.Andrew Koenig와 Barbara E.무 전무는 빌트인(built-in)의 유용성도 인정했다.typeof"그것을 사용하는 것은 종종 미묘한 프로그래밍 오류를 초래하고, 그것이 해결할 수 없는 몇 가지 문제들이 있다"[6]는 주의와 함께.그들은 표준 템플릿 라이브러리에서 제공하는 형식 정의와 같은 형식 규칙을 보다 강력하고 일반적인 기법으로 특징지었다.[6]그러나 스티브 듀허스트는 그러한 규약은 "비용적으로 설계하고 공포하는 것"이며 "단순히 표현의 유형을 추출하는 것이 훨씬 더 쉬울 것"[7]이라고 주장했다.쾨니히와 무는 2011년 C++0x에 대한 기사에서 "일상적인 프로그램을 쓰기 쉽게 만드는 데 선언형이 널리 쓰일 것"[8]이라고 전망했다.
2002년에 Bjarne Strustrup은 표현 유형을 쿼리하는 메커니즘을 가지고 C++ 언어를 확장하고, 유형을 지정하지 않고 객체를 초기화하는 것을 제안했다.[2]스트루스트럽은 기준 드랍 의미론자들이 제공한 것을 관찰했다.typeofGCC와 EDG 컴파일러가 제공하는 운영자는 문제가 될 수 있다.[2]반대로, 표현식의 lvalue-ness에 기초한 기준 유형을 반환하는 연산자는 너무 혼란스러운 것으로 간주되었다.C++ 표준 위원회에 대한 초기 제안서는 두 변종의 조합에 대한 개요를 제시하였다. 운영자는 선언된 유형의 표현에 참조가 포함되어 있는 경우에만 참조 유형을 반환할 것이다.추론된 유형이 표현식의 "선언된 유형"을 반영한다는 점을 강조하기 위해 연산자를 명명하도록 제안되었다.decltype.[2]
인용된 주요 동기의 하나.decltype제안은 완벽한 포워딩 기능 템플릿을 작성하는 능력이었다.[9]경우에 따라서는 그것이 인스턴스화되는 종류에 관계없이 포장된 기능과 동일한 종류를 반환하는 일반적인 포워딩 함수를 쓰는 것이 바람직하다.없는decltype, 이것을 성취하는 것은 일반적으로 가능하지 않다.[9]후행-반환 유형을 이용하는 예:[9]
인트로& foo(인트로& i); 둥둥 뜨다 foo(둥둥 뜨다& f); 템플릿 <계급의 T> 자동차로 투명_포워더(T& t) −> 선언형(foo(t)) { 돌아오다 foo(t); } decltype포장된 함수가 기준 유형을 반환하는지 여부에 대한 정보를 보존하기 때문에 여기에서 필수적이다.[10]
의미론
이와 유사하게sizeof연산자, 의 피연산자decltype평가되지 [11]않다비공식적으로, 반환되는 형식decltype(e)다음과 같이 추론한다.[2]
- 만약 그 표현이
e로컬 또는 네임스페이스 범위에 있는 변수, 정적 멤버 변수 또는 함수 매개 변수, 그 결과 변수 또는 매개 변수의 선언된 유형 - 그렇지 않으면
eLvalue,decltype(e)이다T&, whereTe의 유형이며, e가 x값인 경우 결과는T&&; 그렇지 않으면, e는 prvalue이고 결과는T.
이러한 의미론들은 일반 도서관 작가들의 요구를 충족시키면서 동시에 초보 프로그래머들에게는 직관적이 되도록 고안된 것인데, 그 이유는 바로 이 반환형식 때문이다.decltype항상 소스 코드에 선언된 개체 또는 기능의 유형과 정확히 일치한다.[2]보다 공식적으로 규칙 1은 부모화되지 않은 ID 표현식 및 클래스 멤버 액세스 식에 적용된다.[12][13]예:[12]막대()에 대한 추가 줄에 대한 참고 사항."bar()"에 대해 추론된 형식 아래는 정적으로 선언된 다른 형식에도 불구하고 비종류 유형의 prv 값에는 항상 cv-qualified 유형이 있기 때문에 const int가 아닌 일반 형식이다.
경시하다 인트로&& foo(); 경시하다 인트로 술집을 내다(); 인트로 i; 구조상의 A { 곱절로 하다 x; }; 경시하다 A* a = 새로운 A(); 선언형(foo()) x1; // 타입은 const int&& 입니다. 선언형(술집을 내다()) x2; // type is int 선언형(i) x3; // type is int 선언형(a->x) x4; // 유형이 2배임 선언형((a->x)) x5; // 타입은 const double&& 의 후기 두 호출 사이에 차이가 나는 이유.decltype그 표현은 부모들이(a->x)id-temperature도 멤버 액세스 식도 아니므로 명명된 객체를 나타내지 않는다.[14]식이 l값이기 때문에 추론된 유형은 "식 유형에 대한 참조" 또는const double&.[11]
2008년 12월, 자크코 예르비(Jaakko Jérvi)에 의해 위원회에서 사용불능에 대한 우려가 제기되었다.decltype의도와 일치하지 [1]않는 자격증을 형성하다decltype(e)"타입식 이름인 것처럼" 취급되어야 한다.[15]일본 ISO 회원기구는 C++0x 공식 위원회 초안에 대해 논평하면서 "범위 운영자(::)를 선언형에는 적용할 수 없지만, 그렇게 해야 한다"고 언급했다.다음과 같은 예에서 멤버 유형(내포 유형)을 얻는 것이 이 경우에 유용할 것이다."[16]
벡터<인트로> v; 선언형(v)::value_type i = 0; // int i = 0; 이것과 유사한 이슈는 사용을 금지하는 문구와 관련된 것이다.decltype파생 계급의 선언과 파괴자 호출에서, 데이비드 밴데보르드가 연설했고, 2010년 3월에 작업 신문에 투표했다.[17][18]
유용성
decltypeC++11 이후 C++ 언어 표준에 포함되었다.[12]그것은 많은 컴파일러들에 의해 확장된 것으로 제공된다.Microsoft의 Visual C++ 2010 이상 컴파일러는decltype표준 위원회 제안서에 기술된 의미론과 밀접하게 일치하는 유형 지정자.관리 코드와 네이티브 코드 둘 다와 함께 사용할 수 있다.[10]문서에는 "기본적으로 템플릿 라이브러리를 작성하는 개발자에게 유용하다"[10]고 명시되어 있다. decltype2008년 3월 5일 발매된 버전 4.3에서 GCC C++ 컴파일러의 메인라인에 추가되었다.[19][20] decltype코드기어의 C++ Builder 2009,[21] 인텔 C++ 컴파일러,[22] 클랑에도 있다.[23]
참조
- ^ a b Miller, William M. (2009-09-29). "C++ Standard Core Language Active Issues, Revision 66". ISO/IEC JTC1/SC22/WG21 – The C++ Standards Committee. Retrieved 2009-10-03.
- ^ a b c d e f g Gregor, Douglas; Järvi, Jaakko; Siek, Jeremy; Stroustrup, Bjarne (2003-04-28). "Decltype and auto" (PDF). ISO/IEC JTC1/SC22/WG21 – The C++ Standards Committee. Retrieved 2015-08-28.
- ^ Kalev, Danny (2008-05-08). "Clean Up Function Syntax Mess with decltype". DevX.com. Retrieved 2009-09-04.
- ^ a b c Gibbons, Bill (2000-11-01). "A Portable "typeof" Operator". Dr. Dobb's Journal. Retrieved 2009-09-03.
- ^ a b Alexandrescu, Andrei (2000-10-01). "Generic<Programming>: Mappings between Types and Values". Dr. Dobb's Journal. Retrieved 2009-09-03.
- ^ a b Koenig, Andrew; Barbara E. Moo (2002-02-01). "C++ Made Easier: Naming Unknown Types". Dr. Dobb's Journal. Retrieved 2009-09-03.
- ^ Dewhurst, Steve (2000-08-01). "Common Knowledge: A Bitwise typeof Operator, Part 1". Dr. Dobb's Journal. Retrieved 2009-09-03.
- ^ Koenig, Andrew; Barbara E. Moo (2011-07-19). "4 Useful New Features in C++0x". Dr. Dobb's Journal. Retrieved 2012-01-12.
- ^ a b c Dos Reis, Gabriel; Järvi, Jaakko; Stroustrup, Bjarne (2004-10-12). "Decltype and auto (revision 4)" (PDF). ISO/IEC JTC1/SC22/WG21 – The C++ Standards Committee. Retrieved 2009-09-04.
- ^ a b c "decltype Operator". Microsoft Corporation. Retrieved 2009-09-04.
- ^ a b Dos Reis, Gabriel; Järvi, Jaakko; Stroustrup, Bjarne (2007-07-18). "Decltype (revision 7): proposed wording" (PDF). ISO/IEC JTC1/SC22/WG21 – The C++ Standards Committee. Retrieved 2009-09-04.
- ^ a b c Becker, Pete. "Working Draft, Standard for Programming Language C++" (PDF). ISO/IEC JTC1/SC22/WG21 – The C++ Standards Committee. Retrieved 2009-09-04.
- ^ Miller, William M. (2009-08-03). "C++ Standard Core Language Defect Reports, Revision 65". ISO/IEC JTC1/SC22/WG21 – The C++ Standards Committee. Retrieved 2009-09-15.
- ^ Miller, William M. (2009-08-03). "C++ Standard Core Language Closed Issues, Revision 65". ISO/IEC JTC1/SC22/WG21 – The C++ Standards Committee. Retrieved 2009-09-04.
- ^ Dos Reis, Gabriel; Järvi, Jaakko; Stroustrup, Bjarne (2006-11-05). "Decltype (revision 6): proposed wording" (PDF). ISO/IEC JTC1/SC22/WG21 – The C++ Standards Committee. Retrieved 2009-10-03.
- ^ Miller, William M. (2009-08-03). "C++ CD1 Comment Status". ISO/IEC JTC1/SC22/WG21 – The C++ Standards Committee. Retrieved 2009-10-03.
- ^ Miller, William M. (2010-03-29). "C++ Standard Core Language Defect Reports, Revision 69". ISO/IEC JTC1/SC22/WG21 – The C++ Standards Committee. Retrieved 2010-04-10.
- ^ Vandevoorde, Daveed (2010-02-03). "Core issues 743 and 950: Additional decltype(...) uses" (PDF). ISO/IEC JTC1/SC22/WG21 – The C++ Standards Committee. Retrieved 2010-04-10.
- ^ "C++0x Support in GCC". Free Software Foundation. 2009-08-27. Retrieved 2009-09-04.
- ^ "GCC 4.3 Release Series". Free Software Foundation. 2009-08-13. Retrieved 2009-09-04.
- ^ "Type Specifier decltype (C++0x)". Embarcadero Technologies. Archived from the original on 2011-07-08. Retrieved 2009-09-04.
- ^ "std, Qstd". Intel Corporation. Retrieved 2009-09-04.
- ^ Gregor, Douglas (2011-01-26). "New C++0x feature support in Clang". Archived from the original on 2011-01-30.