decltype 형식 지정자

decltype 형식이 지정 된 식의 형식 지정자를 얻을 수 있습니다.decltype 지정자와 함께 입력은 auto 키워드, 템플릿 라이브러리 작성은 주로 개발자에 게 유용 합니다.사용 auto 및 decltype 는 반환이 템플릿 함수를 선언 하 형식 해당 템플릿 인수의 형식에 따라 다릅니다.또는 사용 하 여 auto 및 decltype 다른 함수에 대 한 호출을 배치 하 고 래핑된 함수 반환 형식 반환 하는 템플릿 함수를 선언 합니다.

 decltype( expression )

매개 변수

Parameter

설명

expression

식입니다.자세한 내용은 식 (C++)를 참조하십시오.

반환 값

expression 매개 변수의 형식입니다.

설명

decltype 형식 지정자 Visual C++ 2010 또는 이후 버전에서 지원 되며 네이티브 또는 관리 되는 코드를 사용할 수 있습니다.

컴파일러의 유형을 확인 하려면 다음 규칙이 적용 됩니다 있는 expression 매개 변수.

  • 경우는 expression 매개 변수에 식별자 나는 클래스 멤버 액세스, decltype(expression) 로 명명 된 엔터티 형식이 expression.이러한 엔터티가 있으면 나는 expression 매개 변수가 오버 로드 된 함수 집합의 이름을 지정 하 고 컴파일러에서 오류 메시지를 얻을 수 있습니다.

  • 경우는 expression 매개 변수는 함수 또는 연산자를 오버 로드 된 함수를 호출 decltype(expression) 함수의 반환 형식이 됩니다.오버 로드 된 연산자를 묶은 괄호는 무시 됩니다.

  • If the expression parameter is an rvalue, decltype(expression) is the type of expression.If the expression parameter is an lvalue, decltype(expression) is an lvalue reference to the type of expression.

다음 코드 예제에서는 몇 가지 사용 방법을 보여 줍니다 있는 decltype 지정자를 입력 합니다.먼저 다음 문을 코딩 한 것으로 가정 합니다.

int var;
const int&& fx(); 
struct A { double x; }
const A* a = new A();

다음에 네가 반환 되는 형식 검사 decltype 문을 다음 표에 나와 있습니다.

형식

참고

decltype(fx());

const int&&

참조가 rvalue 에 있는 const int.

decltype(var);

int

변수 var.

decltype(a->x);

double

멤버 액세스 유형을 지정 합니다.

decltype((a->x));

const double&

안쪽 괄호의 멤버 액세스 식으로 계산할 수 문을 발생할.하 고 있기 때문에 a 로 선언 되는 const 포인터 형식에 대 한 참조입니다 const double.

Decltype 및 자동

사용은 decltype 지정자와 함께 입력은 auto 해당 반환 형식이 템플릿 함수를 선언 하는 키워드를 해당 템플릿 인수의 형식에 따라 달라 집니다.예를 들어, 다음 코드 예제를 템플릿 함수의 반환 형식은 템플릿 인수의 형식에 따라 달라 집니다 것이 좋습니다.코드 예제에서는 알 수 없는 자리 표시자를 나타내는 반환 형식을 지정할 수 있습니다.

template<typename T, typename U>
UNKNOWNfunc(T&& t, U&& u){ return t + u; }; 

소개는 decltype 형식 지정자 개발자가 템플릿 함수가 반환 하는 식의 형식을 얻을 수 있습니다.사용은 대체 함수 선언 구문 나중에 표시 되는 auto 키워드를 하는 decltype 선언에 지정자를 입력는 런타임에 지정 된 반환 형식.코딩할 때 대신 선언에 컴파일할 때 런타임에 지정 된 반환 형식이 결정 됩니다.

다음과 같은 프로토타입을 대체 함수 선언 구문을 보여 줍니다.참고는 const 및 volatile 한정자 및 throw예외 사양 는 선택 사항입니다.해당 function_body 자리 표시자 함수를 수행할 작업을 지정 하는 복합 문을 나타냅니다.코딩 방법으로는 최적으로는 식 에서 자리 표시자의 decltype 문은 지정 된 식이 일치 해야는 return 문이 있는 경우에 function_body.

autofunction_name(parametersopt)constoptvolatileopt−>decltype(expression)throwopt{function_body};

다음 코드 예제에는 런타임에 지정 형식의 반환의 myFunc 템플릿 함수 형식에 따라 결정 됩니다의 tu 템플릿 인수.최선의 코딩 방법으로, 참조가 rvalue 코드 예제도 사용 하는 forward 지원 함수 템플릿을 완벽 한 전달을.자세한 내용은 Rvalue 참조 선언 자: & &를 참조하십시오.

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); }; 

Decltype 및 전달 기능

전달 함수 다른 함수 호출을 래핑합니다.함수 템플릿을 인수, 또는 다른 함수에는 인수를 포함 하는 식의 결과 전달 하는 것이 좋습니다.또한 전달 함수 다른 함수를 호출한 결과 반환 합니다.이 시나리오에서는 전달 함수의 반환 형식 래핑된 함수 반환 형식이 동일 해야 합니다.

이 시나리오에서는 적절 한 형식의 이스케이프를 쓸 수 없습니다의 decltype 지정자를 입력 합니다.decltype 함수 참조 유형을 반환 하는지 여부에 대 한 필수 정보를 잃게 하기 때문에 형식 지정 자가 일반 전달 함수 있습니다.전달 함수의 코드 예에 대 한 이전 참고 하십시오 myFunc 템플릿 함수 예제입니다.

예제

다음 코드 예제는 런타임에 지정 반환 형식의 템플릿 함수 선언 Plus().Plus 함수가 처리 두 피연산자는 operator+ 오버 로드 합니다.더하기 연산자 (+) 및 반환 형식에 따라서 해석의 Plus 함수 함수 인수의 형식에 따라 달라 집니다.

// decltype_1.cpp
// compile with: /EHsc
//
#include "stdafx.h"
#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;
}

Output

이 코드 예제는 다음과 같은 결과 얻을 수 있습니다.

13

13.5

안녕하세요, 세계!

42

요구 사항

Visual C++ 2010 또는 이후 버전입니다.

참고 항목

참조

단순 형식의 이름입니다.