C + + decltype 형식 설명자

8999 단어 C++11decltype
이 시 리 즈 는 @ yhlleo 제품, 전재 출처 를 밝 혀 주세요.
글 링크:http://blog.csdn.net/yhl_leo/article/details/50865552
1. 기본 문법decltype 형식 설명자 가 지정 한 표현 식 의 종 류 를 생 성 합 니 다.이 과정 에서 컴 파일 러 는 표현 식 을 분석 하고 유형 을 얻 지만 표현 식 의 값 을 실제 적 으로 계산 하지 않 습 니 다.
문법:
decltype( expression )

컴 파일 러 는 다음 규칙 을 사용 하여 expression 매개 변수의 유형 을 확인한다.
  • 만약 에 expression 매개 변수 가 식별 자 나 클래스 구성원 이 방문 하면 decltype(expression)expression 이름 을 가 진 실체의 유형 이다.이러한 실체 나 expression 매개 변수 이름 의 리 셋 함수 가 존재 하지 않 으 면 컴 파일 러 는 오류 메 시 지 를 생 성 합 니 다.
  • 만약 expression 매개 변수 가 하나의 함수 나 재 부팅 연산 자 함수 에 대한 호출 이 라면 decltype(expression) 함수 의 반환 유형 입 니 다.연산 자 양쪽 의 괄호 를 다시 불 러 오 는 것 을 무시 합 니 다.
  • 매개 변수 가 오른쪽 값 이면 expression 유형 이다.decltype(expression) 매개 변수 가 왼쪽 값 이 라면 expression 왼쪽 값 참조 유형 expression 입 니 다.

  • 다음 예제 코드 를 드 립 니 다.
    int var;
    const int&& fx(); 
    struct A { double x; }
    const A* a = new A();

    문장
    유형
    주석decltype(expression) expression decltype(fx()); const int && const int
    변수 decltype(var); 의 유형int var
    구성원 접근 형식decltype(a->x); double
    내부 괄호 로 인 한 문 구 는 구성원 접근 계산 이 아 닌 표현 식 입 니 다.decltype((a->x)); 지침 으로 성명 되 었 기 때문에 유형 은 const double& 에 대한 인용 이다.
    2 a 와 인용const 사용 하 는 표현 식 이 변수 가 아니라면 const double 표현 식 결과 에 대응 하 는 유형 을 되 돌려 줍 니 다.그러나 일부 표현 식 은 decltype 에 인용 형식 을 되 돌려 줍 니 다.일반적으로 이러한 상황 이 발생 했 을 때 이 표현 식 의 결과 대상 이 할당 문장의 왼쪽 값 이 될 수 있 음 을 의미 합 니 다.
    // decltype          
    int i = 42, *p = &i, &r = i;
    decltype(r + 0) b; // OK,       int,  b   (    ) int
    decltype(*p) c; // Error, c int&,      
    decltype 은 인용 이기 때문에 decltype 의 결 과 는 인용 유형 입 니 다. 결과 유형 이 decltype 가 가리 키 는 유형 이 라면 r 을 표현 식 의 일부분 으로 할 수 있 습 니 다. 예 를 들 어 decltype(r) 이 표현 식 의 결 과 는 인용 이 아 닌 구체 적 인 값 이 될 것 입 니 다.
    다른 한편, 표현 식 의 내용 이 인용 조작 을 푸 는 것 이 라면 r 인용 유형 을 얻 을 수 있 습 니 다.우리 가 잘 알 고 있 는 것 처럼 인용 지침 을 풀 면 지침 이 가리 키 는 대상 을 얻 을 수 있 고 이 대상 에 게 값 을 부여 할 수 있 기 때문에 r 의 결과 유형 은 r+0 이 아니 라 decltype 이다.
    3 decltype(*p)int&
  • 최상 위 const 와 인용 방식 이 다 릅 니 다 (참조: C + auto 형식 설명자)
  • int 에서 사용 하 는 표현 식 이 변수 라면 decltype 이 변수의 유형 (꼭대기 층 auto 과 인용 포함) 을 되 돌려 줍 니 다.
    const int ci = 0, &cj = ci;
    decltype(ci) x = 0; // x    const int
    decltype(cj) y = x; // y    const int&,y     x
    decltype(cj) z; // Error, z     ,     
  • decltype 의 결과 유형 은 표현 식 형식 과 밀접 한 관 계 를 가진다
  • decltype 에 사 용 된 인용 에 있어 서 변수 명 에 괄호 를 한 쌍 더 하면 얻 는 유형 은 괄호 를 넣 지 않 을 때 와 다 를 수 있다.만약 const 괄호 가 없 는 변 수 를 사용한다 면 그 결 과 는 이 변수의 유형 입 니 다.변수 에 괄호 나 다 중 괄호 를 붙 이면 컴 파일 러 는 표현 식 으로 여 긴 다.
    decltype((i)) d; // Error, d int&,      
    decltype(i) e;   // OK, e        int
  • 템 플 릿 함수 의 반환 형식
  • C + + 11 에 서 는 반환 형식 decltype 형식 설명자 와 decltype 키 워드 를 결합 하여 반환 유형 이 템 플 릿 매개 변수 형식 에 의존 하 는 템 플 릿 함수 임 을 설명 할 수 있 습 니 다.
  • C + + 14 에 서 는 반환 형식 이 없 는 decltype 을 사용 하여 반환 유형 이 템 플 릿 매개 변수 형식 에 달 려 있 음 을 설명 할 수 있 습 니 다.


  • 예 를 들 어 템 플 릿 함수 와 템 플 릿 함 수 를 정의 합 니 다.
    //C++11
     template<typename T, typename U>
    auto myFunc(T&& t, U&& u) -> decltype (forward<T>(t) + forward<U>(u)) 
            { return forward<T>(t) + forward<U>(u); };
    
    //C++14
    template<typename T, typename U>
    decltype(auto) myFunc(T&& t, U&& u) 
            { return forward<T>(t) + forward<U>(u); };
    
    decltype: 매개 변수 가 오른쪽 값 이나 오른쪽 값 참조 라면 조건 부 로 매개 변 수 를 오른쪽 값 참조 로 강제 변환 합 니 다.)
    원본 코드 를 첨부 합 니 다:
    #include <iostream>
    #include <string>
    #include <utility>
    #include <iomanip>
    
    using namespace std;
    
    template<typename T1, typename T2>
    auto Plus(T1&& t1, T2&& t2) -> 
       decltype(forward<T1>(t1) + forward<T2>(t2))
    {
       return forward<T1>(t1) + forward<T2>(t2);
    }
    
    class X
    {
       friend X operator+(const X& x1, const X& x2)
       {
          return X(x1.m_data + x2.m_data);
       }
    
    public:
       X(int data) : m_data(data) {}
       int Dump() const { return m_data;}
    private:
       int m_data;
    };
    
    int main()
    {
       // Integer 
       int i = 4;
       cout << 
          "Plus(i, 9) = " << 
          Plus(i, 9) << endl;
    
       // Floating point
       float dx = 4.0;
       float dy = 9.5;
       cout <<   
          setprecision(3) << 
          "Plus(dx, dy) = " <<
          Plus(dx, dy) << endl;
    
       // String 
       string hello = "Hello, ";
       string world = "world!";
       cout << Plus(hello, world) << endl;
    
       // Custom type
       X x1(20);
       X x2(22);
       X x3 = Plus(x1, x2);
       cout << 
          "x3.Dump() = " << 
          x3.Dump() << endl;
    }

    실행 결 과 는:
    Plus(i, 9) = 13
    Plus(dx, dy) = 13.5
    Hello, world!
    x3.Dump() = 42

    참고 자료:
  • Microsoft Developer Network: decltype(C++)
  • C + + Primer (제5 판) Stanley B. Lippman.
  • 좋은 웹페이지 즐겨찾기