개념(C++)

Concepts (C++)

개념C++ 프로그래밍 언어가 제공하는 템플릿 기능의 확장이다.개념은 템플릿 매개변수에 부울 술어로 명명되며, 컴파일 시간에 평가된다.개념은 템플릿(클래스 템플릿, 함수 템플릿 또는 클래스 템플릿의 멤버 함수)과 연관될 수 있으며, 이 경우 제약조건으로 작용한다: 템플릿 매개 변수로 수용되는 인수 집합을 제한한다.

원래 C++11에 대한 제안으로 거슬러 올라가면, 원래의 개념 사양은 공식적으로 C++20의 필수 부분이 되기 전에 여러 번 수정되었다.

주요 용도

개념의 주요 용도는 다음과 같다.

  • 템플릿 프로그래밍에 유형 분석 도입
  • 실패한 템플릿 인스턴스화에 대한 단순화된 컴파일러 진단
  • 유형 특성을 기반으로 함수 템플릿 오버로드 및 클래스 템플릿 특수화 선택
  • 구속력 있는 자동형식공제

예: EqualityComplicable

다음은 개념 실행 C++ 표준 라이브러리(별도의 ISO 기술 사양, ISO/IEC DTS 21425)에서 "EqualityComplicable"이라는 개념의 선언이다.이 개념은 어떤 유형으로도 충족된다.T그런 것. a그리고b활자의T, 표현들a==b그리고a!=b컴파일하고 그 결과는 "Boolean" 개념을 만족하는 유형으로 전환된다.

템플릿<타이프 이름 T> 콘셉트 EqualityComparable = 필요로 하다(T a, T b) {     { a == b } -> 찌꺼기::동일_과<바가지 긁다>;     { a != b } -> 찌꺼기::동일_과<바가지 긁다>; }; 

이 개념에 제약된 함수 템플릿은 다음과 같이 선언할 수 있다.

공허하게 하다 f(경시하다 EqualityComparable 자동차로&); // 제한된 함수 템플릿 선언 

또는

템플릿 <EqualityComparable T> 공허하게 하다 f(경시하다 T&); // 제한된 함수 템플릿 선언 

그리고 평상시와 같이 다음과 같이 부를 수 있다.

f(42); // OK, int는 EqualityComplete를 충족한다. 

컴파일러 진단

프로그래머가 템플릿의 요구 사항을 충족하지 않는 템플릿 인수를 사용하려고 하면 컴파일러가 오류를 생성한다.개념을 사용하지 않을 때, 그러한 오류는 통화의 맥락에서 보고되는 것이 아니라, 오히려 형식이 사용된 내부, 종종 깊이 중첩된 구현 맥락에서 보고되기 때문에 이해하기 어려운 경우가 많다.

예를 들어,std::sort처음 두 개의 인수는 무작위 액세스 반복자가 되어야 한다.인수가 반복자가 아니거나 다른 범주의 반복자인 경우 다음과 같은 경우 오류가 발생한다.std::sort해당 파라미터를 양방향 반복기로 사용하려는 시도:

찌꺼기::리스트를 작성하다<인트로> l = {2, 1, 3}; 찌꺼기::분류하다(l.시작되다(), l.종지부를 찍다()); 

개념 없는 일반적인 컴파일러 진단은 50줄 이상의 출력이며, 두 개의 반복기를 빼려는 식을 컴파일하지 못하는 것으로 시작한다.

 즉석화  '공허하게 하다 찌꺼기::____(_랜덤액세스반복기, _랜덤액세스반복기, _Compare) [와 함께 _랜덤액세스반복기 = 찌꺼기::_List_iterator<인트로>; _Compare = __gnu_cxx::__ops::_Iter_less_iter]':  착오: 아니요. 짝을 맞추다 을 위해 '운영자-' (피연산자 종류들 이다 '찌꺼기::_List_iterator<인트로>' 그리고 '찌꺼기::_List_iterator<인트로>')  찌꺼기::__lg(__마지막 - __첫번째) * 2,  [..] 

개념을 사용할 경우, 오류를 감지하여 통화의 맥락에서 보고할 수 있다.

착오: 할 수 없다 부르다 기능을 하다 '공허하게 하다 찌꺼기::분류하다(_레이터, _레이터) [와 함께 _레이터 = 찌꺼기::_List_iterator<인트로>]' 주석을 달다:   콘셉트 '랜덤액세스반복기()' 있었다 아닌 만족한 

과부하 분해능

개념은 SFINAE태그 발송의 대안으로 기능 템플릿 과부하 및 해당 템플릿 인수의 속성에 기반한 클래스 템플릿 전문화를 선택하는 데 사용될 수 있다.어떤 인수가 둘 이상의 개념을 만족시킬 경우, 제약이 많은 개념과 관련된 과부하가 선택된다.

유형공제

제한되지 않은 형식 공제 자리 표시자 대신 개념을 사용할 수 있음auto변수 선언 및 함수 반환 유형:

자동차로     x1 = f(y); // x1 유형은 f가 반환되는 모든 유형으로 추론됨 정렬 가능 자동차로 x2 = f(y); // x2 유형은 추론되지만 정렬 가능을 만족하는 경우에만 컴파일됨 

이행여부

ISO/IEC TS 19217:2015에 명시된 개념 TS는 GCC 6.의 실험적인 특징으로 구현된다.[1] C++20 개념은 GCC 10,[2] MSVC 19.30,[3] 클랑 10에서 완전하게 구현된다.[4]

역사

일반적으로 "C++0x 개념"으로 알려진 다른 형태의 개념들이 C++11의 작업 논문에 일시적으로 받아들여졌으나 2009년에 삭제되었다.[5]"C++0x 개념"에는 개념 자체 외에도 개념 맵(예: "Stack" 개념을 수용할 수 있는 기능)이 포함되어 있었다.std::vector, 다음과 같은 "Stack" 작업 자동 매핑push()에 대해 다르게 명명된 작업std::vector예를 들어push_back()) 및 공리(연관성 또는 공리성과 같은 의미속성을 지정하여 컴파일러가 증거 없이 이러한 속성을 활용할 수 있도록 하는 기능).

이 버려진 제안과는 대조적으로, 개념의 C++20 버전을 "개념 Lite"[6]라고 부르기도 한다.

2016년 3월 C++ 표준위원회 회의 때 진화 워킹그룹이 콘셉트를 메인라인 C++17 표준으로 병합하는 쪽으로 움직였으나 전체 위원회에서 부결됐다.[7]

개념 v1은 C++20 초안으로 통합되었다.[8]

개념에 따라 달라지는 레인지 기능의 '원 레인지' 버전도 C++20으로 통합됐다.

참고 항목

메모들

  1. ^ "GCC 6 Release Series - Changes, New Features, and Fixes".
  2. ^ "C++ compiler support (gcc)".
  3. ^ "C++ compiler support".
  4. ^ "C++ Support in Clang".
  5. ^ Bjarne Stroustrup (22 July 2009). "The C++0x "Remove Concepts" Decision". Dr. Dobbs.
  6. ^ Andrew Sutton (24 February 2013). "Concepts Lite: Constraining Templates with Predicates". isocpp.org.
  7. ^ Honermann, Tom (6 March 2016). "Why Concepts didn't make C++17". honermann.net.
  8. ^ "2017 Toronto ISO C++ Committee Discussion Thread (Concepts in C++20; Coroutines, Ranges and Networking TSes published) : cpp".

참조

외부 링크