ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • decltype 타입 지정자란?
    언어/C, C++ 2025. 2. 18. 19:03

    변수를 초기화하는데 표현식을 사용하는 것이 아닌, 컴파일러에서 표현식으로부터 추론한 타입으로 변수를 정의하고자 할 때 사용할 수 있으며 이 지정자는 피연산자 타입을 반환한다.

    컴파일러에서는 타입을 결정하기 위해 표현식을 분석할 뿐 평가하지는 않는다.

     

    decltype(f()) sum = x;   // sum의 타입은 f에서 반환한 타입

    컴파일러에서는 f를 호출했을 때 이 함수에서 반환하게 될 타입을 sum의 타입으로 지정한다.

     

    const int ci = 0, &cj = ci;
    decltype(ci) x = 0;    // x는 const int 타입
    decltype(cj) y = x;    // y는 const int& 타입이고 x와 결합
    decltype(cj) z;        // 오류 : z는 참조자이므로 초기화해야 함

    decltype 에서 상위 const와 참조자를 다루는 방식은 auto와 다소 다르다.

    decltype 을 적용하는 표현식이 변수이면 decltype 에서는 상위 const와 참조자를 포함해 대상 변수의 타입을 반환한다.

    cj는 참조자이므로 decltype(cj)는 참조자 타입이다.

    다른 참조자처럼 z는 초기화 해아한다.

     

     

    int i = 42, *p = &i, &r = i;
    decltype(r + 0) b;    // 좋음 : 덧셈은 int를 바노한하므로 b는 초기화하지 않는 int
    decltype(*p) c;       // 오류 : c는 int& 이므로 초기화 필요

    decltype을 변수가 아닌 표현식에 적용하면 해당 표현식에서 반환하는 타입을 얻는다.

    일부 표현식에서는 decltype을 적용하면 참조자 타입을 반환한다.

    decltype에서는 대입의 왼쪽 피연산자가 될 수 있는 객체를 반환한다는 표현식에 대해서는 참조자 타입을 반환한다.

    r은 참조자이므로 decltype(r)은 참조자 타입이므로 r에서 참조하는 대상의 타입이 필요하면 표현식에 r + 0처럼 쓰면 된다.

    이는 비참조자 타입인 값을 반환하는 표현식이다.

    다른 편으로 역참조 연산자는 decltype에서 참조자를 반환하는 표현식의 한 예이다.

    포인터를 역참조하면 그 포인터로 가리키는 객체를 얻을 뿐더러 그 객체에 대입할 수도 있다.

     

     

    decltype((i)) d;    // 오류 : d는 int&이므로 초기화 필요
    decltype(i) e;      // 좋음 : e는 초기화하지 않은 int

    dectype에서 하는 추론이 대상 표현식의 형식에 의존한다는 점은 auto와 다르다.

    decltype에서 반환하는 타입이 변수 이름이 아닌 괄호에 영향을 받는다.

    괄호 없이 변수에 decltype을 적용하면 해당 변수의 타입을 얻지만, 하나 이상의 괄호 집합으로 변수 이름을 감싸면 컴파일러에서는 이 피연산자를 표현식으로 평가한다.

    변수는 대입에서 왼쪽 피연산자가 될 수 있는 표현식이므로 결과적으로 decltype을 적용하면 참조자를 반환한다.

    decltype((변수))는 항상 참조자 타입이지만 decltype(변수)는 대상 '변수'가 참조자일 때만 참조자 타입이다.

     

     

     

    씹어먹는 C++ - <16 - 3. 타입을 알려주는 키워드 decltype 와 친구 std::declval>

     

    씹어먹는 C++ - <16 - 3. 타입을 알려주는 키워드 decltype 와 친구 std::declval>

    decltype 키워드를 통해서 우리가 원하는 식의 타입을 알 수 있습니다. 만일 해당 식이 단순한 식별자 표현식 (identifier expression) 이라면 그냥 그 식의 타입으로 치환됩니다. 그 이외의 경우라면 해

    modoocode.com

     

     

    '언어 > C, C++' 카테고리의 다른 글

    constexpr 변수란?  (0) 2025.02.17
    [C++] Vector STL  (0) 2021.07.18
    [C++] Queue STL  (0) 2021.07.17
    [C++] Stack STL  (0) 2021.07.17
    [C++] List STL  (0) 2021.07.16

    댓글