Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++에서 auto와 decltype의 관계는 무엇입니까?


Auto 및 decltype은 서로 다른 용도로 사용되므로 일대일로 매핑되지 않습니다. auto는 자동 유형 추론에 사용되는 C++11 이상의 키워드입니다. decltype 유형 지정자는 지정된 표현식의 유형을 생성합니다. 변수에 할당된 값을 기반으로 유형을 추론하는 auto와 달리 decltype은 전달된 표현식에서 유형을 추론합니다. decltype에서 반환된 값은 다른 변수를 정의하는 데 직접 사용할 수 있습니다.

auto는 템플릿 매개변수 추론 규칙을 따릅니다. 이 규칙에 대한 자세한 내용은 https://en.cppreference.com/w/cpp/language/template_argument_deduction

에서 확인할 수 있습니다.

decltype에는 표준에 정의된 규칙을 따라야 하는 규칙이 있습니다. 다음은 이러한 규칙이 포함된 표준에서 발췌한 내용입니다.

sizeof 연산자와 유사하게 decltype의 피연산자는 평가되지 않습니다. 비공식적으로, decltype(e)에 의해 반환된 유형은 다음과 같이 추론됩니다 -

  • 표현식 e가 로컬 또는 네임스페이스 범위의 변수, 정적 멤버 변수 또는 함수 매개변수를 참조하는 경우 결과는 해당 변수 또는 매개변수의 선언된 유형입니다.
  • e가 함수 호출 또는 오버로드된 연산자 호출인 경우 decltype(e)은 해당 함수의 선언된 반환 유형을 나타냅니다.
  • 그렇지 않고 e가 lvalue이면 decltype(e)은 T&입니다. 여기서 T는 e의 유형입니다. e가 rvalue이면 결과는 T

이러한 의미 체계는 일반 라이브러리 작성자의 요구를 충족하도록 설계되었으며 동시에 decltype의 반환 유형이 항상 개체 또는 함수의 유형과 정확히 일치하기 때문에 초보 프로그래머에게 직관적입니다. 소스 코드. 보다 공식적으로 규칙 1은 괄호로 묶이지 않은 id-expression 및 클래스 멤버 액세스 표현식에 적용됩니다. 함수 호출의 경우 추론된 형식은 오버로드 해결 규칙에 따라 결정된 정적으로 선택한 함수의 반환 형식입니다.

예시

auto 및 decltype 사용 예,

#include<iostream>
#include<vector>

using namespace std;

int main() {
    // Using auto for type deduction
    vector<int> arr(10);
    for(auto it = arr.begin(); it != arr.end(); it ++) {
        cin >> *it;
    }

    // Using decltype for type deduction
    vector<int> arr(10);
    for (decltype(arr.begin()) it = arr.begin(); it != arr.end(); it++) {
        cin >> *it;
    }
    return 0;
}

decltype으로 표시되는 유형은 auto로 추론되는 유형과 다를 수 있습니다. C++의 유형 추론에 대한 12페이지 설명에서 이러한 미묘한 차이점에 대해 자세히 알아볼 수 있습니다. https://thbecker.net/articles/auto_and_decltype/section_01.html