Namespaces
Variants

std::experimental::ranges:: common_reference

From cppreference.net
template < class ... T >
struct common_reference ;
(ranges TS)

T... 타입들의 공통 참조 타입을 결정합니다. 즉, T... 에 있는 모든 타입들이 변환되거나 바인딩될 수 있는 타입을 의미합니다. 이러한 타입이 존재하는 경우(아래 규칙에 따라 결정됨), 멤버 type 은 해당 타입을 나타냅니다. 그렇지 않으면 type 멤버가 존재하지 않습니다. T... 에 있는 어떤 타입이 (가능하게는 cv-qualified) void 를 제외한 불완전한 타입인 경우, 동작은 정의되지 않습니다.

참조 타입이 주어졌을 때, common_reference 는 제공된 참조 타입들이 모두 바인딩될 수 있는 참조 타입을 찾으려 시도하지만, 그러한 참조 타입을 찾을 수 없는 경우 비-참조 타입을 반환할 수 있습니다.

  • sizeof... ( T ) 가 0이면, type 멤버가 존재하지 않습니다.
  • sizeof... ( T ) 가 1이면 (즉, T... 이 단일 타입 T0 만 포함하는 경우), type 멤버는 T0 와 동일한 타입을 나타냅니다.
  • sizeof... ( T ) 가 2이면 (즉, T... 이 두 타입 T1 T2 를 포함하는 경우):
    • T1 T2 가 모두 참조 타입이고, T1 T2 단순 공통 참조 타입 S (아래에 정의됨)이 존재하면, 멤버 타입 type S 를 나타냅니다;
    • 그렇지 않고, basic_common_reference < T1R, T2R, T1Q, T2Q > :: type 이 존재하면 (여기서 TiR std:: remove_cv_t < std:: remove_reference_t < Ti >> 이고, TiQ TiQ < TiR > Ti 가 되는 별칭 템플릿임), 멤버 타입 type 은 해당 타입을 나타냅니다;
    • 그렇지 않고, decltype ( false ? val < T1 > ( ) : val < T2 > ( ) ) (여기서 val 은 함수 템플릿 template < class T > T val ( ) ; 임)이 유효한 타입을 나타내면, 멤버 타입 type 은 해당 타입을 나타냅니다;
    • 그렇지 않고, ranges:: common_type_t < T1, T2 > 이 유효한 타입이면, 멤버 타입 type 은 해당 타입을 나타냅니다;
    • 그렇지 않으면, 멤버 타입이 존재하지 않습니다.
  • sizeof... ( T ) 가 2보다 크면 (즉, T... T1, T2, R... 타입들로 구성된 경우), ranges :: common_reference_t < T1, T2 > 이 존재하면, 멤버 type ranges :: common_reference_t < ranges :: common_reference_t < T1, T2 > , R... > 을 나타냅니다 (해당 타입이 존재하는 경우). 다른 모든 경우에는 type 멤버가 존재하지 않습니다.

두 참조 타입 T1 T2 단순 공통 참조 타입 은 다음과 같이 정의됩니다:

  • 만약 T1 cv1 X & 이고 T2 cv2 Y & 인 경우(즉, 둘 다 lvalue 참조 타입인 경우): 이들의 단순 공통 참조 타입은 decltype ( false ? std:: declval < cv12 X & > ( ) : std:: declval < cv12 Y & > ( ) ) 이며, 여기서 cv12 cv1 cv2 의 합집합입니다. 단, 해당 타입이 존재하고 참조 타입인 경우에 한합니다.
  • 만약 T1 T2 가 모두 rvalue 참조 타입인 경우: T1 & T2 & 의 단순 공통 참조 타입(이전 항목에 따라 결정됨)이 존재한다면, C 를 해당 타입에 대응하는 rvalue 참조 타입으로 표기합니다. 만약 std:: is_convertible < T1, C > :: value std:: is_convertible < T2, C > :: value 가 모두 true 라면, T1 T2 의 단순 공통 참조 타입은 C 입니다.
  • 그렇지 않은 경우, 두 타입 중 하나는 lvalue 참조 타입 A & 이고 다른 하나는 rvalue 참조 타입 B && 이어야 합니다( A B 는 cv-qualified일 수 있음). D A & B const & 의 단순 공통 참조 타입(존재하는 경우)으로 표기합니다. 만약 D 가 존재하고 std:: is_convertible < B && , D > :: value true 라면, 단순 공통 참조 타입은 D 입니다.
  • 그렇지 않으면 단순 공통 참조 타입이 존재하지 않습니다.

목차

멤버 타입

이름 정의
type 모든 T... 에 대한 공통 참조 타입

헬퍼 타입

template < class ... T >
using common_reference_t = typename common_reference < T... > :: type ;
template < class T, class U, template < class > class TQual, template < class > class UQual >
struct basic_common_reference { } ;

클래스 템플릿 basic_common_reference 는 사용자 정의 타입(일반적으로 프록시 참조)에 대한 common_reference 의 결과에 영향을 줄 수 있는 커스터마이제이션 포인트입니다. 기본 템플릿은 비어 있습니다.

특수화

프로그램은 첫 두 매개변수 T U 에 대해 basic_common_reference<T, U, TQual, UQual> 를 특수화할 수 있습니다. 단, std:: is_same < T, std:: decay_t < T >> std:: is_same < U, std:: decay_t < U >> 가 모두 참이고 둘 중 적어도 하나가 프로그램 정의 타입에 의존하는 경우에 한합니다.

이러한 특수화에 type 이라는 멤버가 있는 경우, 이는 TQual < T > UQual < U > 모두 변환 가능한 타입을 지칭하는 public이며 모호하지 않은 멤버 타입이어야 합니다. 추가적으로, ranges :: basic_common_reference < T, U, TQual, UQual > :: type ranges :: basic_common_reference < U, T, UQual, TQual > :: type 은 동일한 타입을 나타내야 합니다.

프로그램은 세 번째 또는 네 번째 매개변수에 대해 basic_common_reference 를 특수화해서는 안 되며, common_reference 자체를 특수화해서도 안 됩니다. 이러한 규칙을 위반하여 특수화를 추가하는 프로그램은 정의되지 않은 동작을 가집니다.

참고 사항

예제

참고 항목

여러 타입들의 공통 타입을 결정합니다
(클래스 템플릿)
타입 집합의 공통 타입을 결정합니다
(클래스 템플릿)
두 타입이 공통 참조 타입을 공유함을 명시합니다
(컨셉트)