Namespaces
Variants

Concepts library (since C++20)

From cppreference.net

개념 라이브러리는 템플릿 인자의 컴파일 타임 검증과 타입의 속성에 기반한 함수 디스패치를 수행하는 데 사용할 수 있는 기본 라이브러리 개념들의 정의를 제공합니다. 이러한 개념들은 프로그램에서의 등식 추론을 위한 기초를 제공합니다.

표준 라이브러리의 대부분 개념은 구문 요구사항과 의미론적 요구사항을 모두 부과합니다. 표준 개념은 구문 요구사항이 충족되면 만족(satisfied) 된다고 하며, 만족 상태에서 의미론적 요구사항(존재하는 경우)도 추가로 충족되면 모델링(modeled) 된다고 합니다.

일반적으로 컴파일러가 검사할 수 있는 것은 구문 요구사항뿐입니다. 프로그램의 유효성이나 의미가 템플릿 인자 시퀀스가 개념을 모델링하는지 여부에 의존하고, 개념이 만족되지만 모델링되지 않거나 사용 지점에서 의미론적 요구사항이 충족되지 않는 경우, 프로그램은 형식 오류이며, 진단 불필요 입니다.

목차

동등성 보존

표현식은 동등한 입력이 주어졌을 때 동등한 출력을 생성한다면 equality-preserving 입니다. 여기서

  • 입력은 피연산자들로 구성되며(표현식이 의미론적으로 유효할 필요는 없음),
  • 출력은 표현식의 결과와 표현식에 의해 피연산자에 가해진 모든 수정 사항(있는 경우)으로 구성됩니다

여기서, 용어의 편의를 위해, "피연산자"는 id-expression 또는 std::move , std::forward , 그리고 std::declval 의 호출로 구성된 가장 큰 하위 표현식을 가리킵니다.

각 피연산자의 cv 한정자와 값 범주는 해당 유형의 각 템플릿 타입 매개변수가 cv-비한정 완전 비배열 객체 타입을 나타낸다고 가정하여 결정됩니다.

동등성 보존이 요구되는 모든 표현식은 추가로 안정성이 요구됩니다. 즉, 동일한 입력 객체들에 대한 두 번의 평가는 해당 입력 객체들의 명시적인 중간 수정 없이 동일한 출력을 가져야 합니다.

달리 명시되지 않는 한, requires expression 에 사용되는 모든 표현식은 표준 라이브러리 concepts 에서 동등성 보존(equality preserving)이 요구되며, 표현식의 평가는 비상수(non-constant) 피연산자만 수정할 수 있습니다. 상수(constant)인 피연산자는 수정되어서는 안 됩니다.

표준 라이브러리에서 다음 개념들은 동등성 보존을 하지 않는 requires 표현식을 가질 수 있습니다:

*번역 결과:* HTML 태그와 속성은 번역하지 않고 원본 형식을 유지합니다. ` `, `
`, `` 태그 내부의 텍스트는 번역하지 않습니다.
C++ 관련 용어는 번역하지 않습니다. 정확성과 전문성이 요구됩니다.

암시적 표현 변형

상수 lvalue 피연산자에 대해 비수정적인 표현식을 사용하는 requires expression 은 해당 피연산자에 대해 비상수 lvalue 또는 (가능하다면 상수) rvalue를 허용하는 해당 표현식의 추가 변형을 암묵적으로 요구합니다. 단, 이러한 표현식 변형이 다른 의미론으로 명시적으로 요구된 경우는 제외됩니다.

이러한 암시적 표현 변형 은 선언된 표현식과 동일한 의미론적 요구사항을 충족해야 합니다. 구현체가 이러한 변형의 구문을 검증하는 범위는 명시되지 않습니다.

template<class T>
concept C = requires(T a, T b, const T c, const T d)
{
    c == d;           // 표현식 #1: 피연산자를 수정하지 않음
    a = std::move(b); // 표현식 #2: 두 피연산자 모두를 수정함
    a = c;            // 표현식 #3: 왼쪽 피연산자 `a`를 수정함
};
// 표현식 #1은 c == d에 대한 요구사항(비수정 포함)을 충족하는
// 추가적인 표현식 변형들을 암묵적으로 요구하며,
// 마치 다음 표현식들도 선언된 것처럼 동작합니다:
// ------ const == const ------- ------ const == non-const ---
//                                         c  ==           b;
//            c == std::move(d);           c  == std::move(b);
// std::move(c) ==           d;  std::move(c) ==           b;
// std::move(c) == std::move(d); std::move(c) == std::move(b);
// -- non-const == const ------- -- non-const == non-const ---
//           a  ==           d;            a  ==           b;
//           a  == std::move(d);           a  == std::move(b);
// std::move(a) ==           d;  std::move(a) ==           b;
// std::move(a) == std::move(d); std::move(a) == std::move(b);
// 표현식 #3은 a = c에 대한 요구사항
// (두 번째 피연산자의 비수정 포함)을 충족하는
// 추가적인 표현식 변형들을 암묵적으로 요구하며,
// 마치 a = b (비상수 lvalue 변형)와
// a = std::move(c) (상수 rvalue 변형) 표현식이 선언된 것처럼 동작합니다.
// 참고: 표현식 #2가 이미 비상수 rvalue 변형(a == std::move(b))을
// 명시적으로 요구하므로, 표현식 #3은 이를 더 이상 암묵적으로 요구하지 않습니다.
// 타입 T는 위 concept C의 명시적으로 기술된 문법적 요구사항은 충족하지만
// 추가적인 암묵적 요구사항은 충족하지 않습니다
// (즉, T는 C를 만족하지만(satisfies) 모델링하지는 않음(model)):
// C<T>를 요구하는 프로그램은 형식이 잘못되었습니다(진단 불필요).
struct T
{
    bool operator==(const T&) const { return true; }
    bool operator==(T&) = delete;
};

표준 라이브러리 개념

다음 네임스페이스에 정의됨 std
핵심 언어 개념
헤더에 정의됨 <concepts>
(C++20)
한 타입이 다른 타입과 동일함을 명시
(concept)
한 타입이 다른 타입으로부터 파생되었음을 명시
(concept)
한 타입이 다른 타입으로 암시적으로 변환 가능함을 명시
(concept)
두 타입이 공통 참조 타입을 공유함을 명시
(concept)
두 타입이 공통 타입을 공유함을 명시
(concept)
(C++20)
타입이 정수형 타입임을 명시함
(concept)
해당 타입이 부호 있는 정수 타입임을 명시함
(concept)
타입이 부호 없는 정수형임을 명시함
(concept)
타입이 부동소수점 타입임을 명시합니다
(concept)
한 타입이 다른 타입으로부터 할당 가능함을 명시
(concept)
타입이 교환 가능하거나 두 타입이 서로 교환될 수 있음을 명시
(concept)
해당 타입의 객체가 파괴될 수 있음을 명시
(concept)
해당 타입의 변수가 일련의 인자 타입들로부터 생성되거나 바인딩될 수 있음을 명시함
(concept)
해당 타입의 객체가 기본 생성될 수 있음을 명시합니다
(concept)
해당 타입의 객체가 이동 생성될 수 있음을 명시함
(concept)
해당 타입의 객체가 복사 생성 및 이동 생성이 가능함을 명시
(concept)
비교 개념
헤더에 정의됨 <concepts>
 (C++20)
타입이 불린 컨텍스트에서 사용될 수 있음을 명시
( 설명 전용 개념* )
operator == 가 동치 관계임을 명시함
(concept)
해당 타입의 비교 연산자들이 완전 순서를 생성함을 명시
(concept)
헤더에 정의됨 <compare>
주어진 타입들에 대해 <=> 연산자가 일관된 결과를 생성함을 명시
(concept)
객체 개념
헤더에 정의됨 <concepts>
(C++20)
해당 타입의 객체가 이동 및 교환 가능함을 명시
(concept)
(C++20)
해당 타입의 객체가 복사, 이동 및 스왑될 수 있음을 명시
(concept)
해당 타입의 객체가 복사, 이동, 교환 및 기본 생성될 수 있음을 명시
(concept)
(C++20)
어떤 타입이 regular임을 명시합니다. 즉, 해당 타입이 semiregular 이면서 동시에 equality_comparable 임을 의미합니다.
(concept)
Callable 개념
헤더에 정의됨 <concepts>
호출 가능 타입이 주어진 인수 타입 집합으로 호출될 수 있음을 명시
(concept)
(C++20)
호출 가능 타입이 부울 조건자임을 명시
(concept)
(C++20)
호출 가능 타입이 이항 관계임을 명시합니다
(concept)
relation 이 동치 관계를 부과함을 명시
(concept)
relation 이 엄격한 약순서(strict weak ordering)를 부과함을 명시
(concept)

추가 개념들은 the iterators library , the algorithms library , 그리고 the ranges library 에서 찾을 수 있습니다.

참고 항목