C + + decltype 형식 설명자
글 링크: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&
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
decltype
형식 설명자 와 decltype
키 워드 를 결합 하여 반환 유형 이 템 플 릿 매개 변수 형식 에 의존 하 는 템 플 릿 함수 임 을 설명 할 수 있 습 니 다.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
참고 자료:
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C++11 특성 소결 의 decltype,클래스 내 초기 화,목록 초기 화 반환 값decltype()은 괄호 안의 표현 식 을 실행 하지 않 습 니 다.decltype 이 되 돌아 오 는 형식 은 성명 에 사용 되 며 단순 한 판단 에 사용 할 수 없습니다.예 를 들 어 decltype(a)==i...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.