컴파일 시간에 타입을 결정하는~

보물창고·2022년 9월 4일
0

1. auto

  • auto는 어떠한 방법으로 타입을 결정할까?

1) auto를 값 타입으로 사용할 때

우변 수식이 가진 참조, const , volatile 속성을 제거하고, 타입을 결정함.

problem

int 변수, int& 변수, const int 변수, const int & 변수를 초기화하고,
이를 auto 받아서 타입조사를 해보아라.

2) auto를 참조 타입으로 사용할 때

우변 수식이 가진 ref속석만 제거하고, const, volatile 속성은 유지됨.
-> 타입에 ref가 있으니까 ref 타입임.

problem

: 위의 내용을 코드를 통해 확인해보아라.

2. decltype

: decltype( 변수, 또는 연산자, )

  • 괄호안의 수식이 lvalue라면 참조, 아니면 값 타입으로 결정됨.

  • 관련 코드
    : 밑의 코드를 따라 따라 쳐보자...

int main()
{
	int  n = 0;
	int* p = &n;


	decltype(n) d1;	// int   // n = 10;
   	decltype(p) d2;	// int*

	// (수식) : 수식이 lvalue라면 참조, 아니면 값 타입
	decltype(*p)  d3; // *p = 10;   int&
	decltype((n)) d4; // (n) = 10;  int&

	decltype(n + n) d5; // n+n = 10 가 될수 없다.  int 
	decltype(++n)   d6; // ++n = 10; ok..     int&
	decltype(n++)   d7; // n++ = 10; error.   int

	int x[3] = { 1,2,3 };

	decltype(x[0]) d8;  // x[0] = 10; ok    int&
	auto a1 = x[0];		// int
}

int x = 10;

int& foo(int a, int b) 
{
	return x;
}

int main()
{
	auto ret1 = foo(1, 2); // int 

	// 평가되지 않는 표현식(unevaluated expression)
    // foo 함수의 반환값은 int&이므로, 
    // ret2는 int& 타입으로 타입이 결정됨.
	decltype( foo(1, 2) ) ret2 = foo(1,2);  // int&

	// C++14
	decltype(auto) ret3 = foo(1, 2); // int&


}
profile
🔥🔥🔥

0개의 댓글