C ++ 20에는 특정 제한 엔티티가 다른 제한 엔티티보다 "더 제한적"인시기를 결정하는 메커니즘이 있습니다. 이것은 간단한 것이 아닙니다.
이것은 제약 조건을 원자 구성 요소 ( 제약 정규화 라고하는 프로세스)로 분해하는 개념으로 시작합니다 . 여기에 들어가는 것은 너무 복잡하고 복잡하지만 기본 개념은 구속 조건의 각 표현식이 개념이 아닌 구성 요소 하위 표현식에 도달 할 때까지 재귀 적으로 원자 적 개념으로 분류된다는 것입니다.
그러므로 integral
, signed_integral
개념 과 개념 이 어떻게 정의 되는지 봅시다 :
template<class T>
concept integral = is_integral_v<T>;
template<class T>
concept signed_integral = integral<T> && is_signed_v<T>;
의 분해 integral
는 단지 is_integral_v
입니다. 의 분해는 signed_integral
입니다 is_integral_v && is_signed_v
.
이제 제약 조건 추정 의 개념을 살펴 보자 . 복잡하지만, 기본 아이디어는 C1의 분해에 C2의 모든 하위 표현식이 포함 된 경우 제약 조건 C1이 제약 조건 C2를 "취득"한다고합니다. 우리는이 볼 수있는 integral
포괄하지 않습니다 signed_integral
,하지만 signed_integral
하지 썸을 integral
이 모든 것을 포함하고 있기 때문에, integral
않습니다.
다음으로 제한된 엔티티를 주문합니다.
* D1과 D2가 모두 구속 된 선언이고 D1의 관련 제약 조건이 D2의 제약 조건을 가정하면 선언 D1은 선언 D2만큼 제한된다. 또는 * D2에는 연관된 구속 조건이 없습니다.
을 signed_integral
포함 하기 때문에 integral
, <signed_integral> wrapper
는 <integral> wrapper
. 그러나 하위 가정이 되돌릴 수 없기 때문에 그 반대가 아닙니다.
따라서 "보다 제한적인"엔터티에 대한 규칙에 따라 :
D1이 적어도 D2만큼 구속되고 D2가 D1만큼 구속되지 않은 경우 선언 D1은 다른 선언 D2보다 더 구속됩니다.
(가) 이후 <integral> wrapper
와 같은 제약으로 적어도 아닌 <signed_integral> wrapper
, 후자는 이전보다 더 제한된 생각된다.
따라서 두 사람 모두가 적용될 수 있으면 더 구속 된 선언이 이깁니다.
제약 조건 Subsumption의 규칙은 표현식이 아닌 표현식이 발견되면 중지 됩니다 concept
. 따라서이 작업을 수행 한 경우 :
template<typename T>
constexpr bool my_is_integral_v = std::is_integral_v<T>;
template<typename T>
concept my_signed_integral = my_is_integral_v<T> && std::is_signed_v<T>;
이 경우에는 my_signed_integral
을 포함 하지 않습니다std::integral
. 와 my_is_integral_v
동일하게 정의되어 있지만 std::is_integral_v
개념이 아니기 때문에 C ++의 Subsumption 규칙은이를 통해 피어 규칙이 동일한 지 판단 할 수 없습니다.
따라서 추정 규칙을 사용하면 원자 개념에 대한 개념을 벗어난 개념을 작성할 수 있습니다.