SlideShare a Scribd company logo
1 of 15
Download to read offline
CHAPTER 1
EFFECTIVE MODERN C++
김지환

mastrayer@naver.com
CHAPTER 1. 형식 연역
DEDUCING TYPES
형식 연역 = 타입 추론(type deduction)

현대적인 C++에서는 auto, decltype, 템플릿 호출 지점에서 형식
연역이 일어난다.
CHAPTER 1. 형식 연역
ITEM 1 : 템플릿 형식 연역 규칙을 숙지하라
이 코드에서 컴파일러는 expr을 이용해 

두가지 타입(T, param)을 추론함.

이 두 형식이 다를 경우가 많은데 

const, &같은 수식어들이 붙기 때문.

타입이 추론되는 경우는 3가지가 있다.
template<typename T>
void f(const T& param);
int expr = 0;
f(expr);
// T : int
// ParamType : const int&
CHAPTER 1. 형식 연역
ITEM 1 : 템플릿 형식 연역 규칙을 숙지하라
1. ParamType이 참조 타입이지만 보편 참조는 아닌 경우

만일 expr이 참조 형식이면 참조 부분을 무시

expr의 타입을 ParamType에 대해 패턴 매칭으로 대응시켜 T의
타입을 결정
CHAPTER 1. 형식 연역
ITEM 1 : 템플릿 형식 연역 규칙을 숙지하라
template<typename T>
void f(T& param);
int x = 27;
const int cx = x;
const int& rx = x;
f(x); // T: int , param: int&
f(cx); // T: const int , param: const int&
f(rx); // T: const int , param: const int&
1. f(cx)를 보면, 객체의 const성은 T에 대해 추론된 형식의 일부가 된다. 

2. f(rx)를 보면, rx는 참조 타입이지만 추론 과정에서 참조성이 무시되기 때문에 T는 비참조 타입으로 추론된다.
CHAPTER 1. 형식 연역
ITEM 1 : 템플릿 형식 연역 규칙을 숙지하라
template<typename T>
void f(const T& param);
int x = 27;
const int cx = x;
const int& rx = x;
f(x); // T: int , param: const int&
f(cx); // T: int , param: const int&
f(rx); // T: int , param: const int&
1. 이제는 param이 const에 대한 참조로 간주되므로, const가 T의 일부로 추론될 필요가 없다.

2. 그래서 f(cx)를 보면 T는 int로 추론되었다.

3. 마찬가지로 f(rx)도 T는 int로 추론되고 rx의 참조성은 무시된다.
CHAPTER 1. 형식 연역
ITEM 1 : 템플릿 형식 연역 규칙을 숙지하라
2. ParamType이 보편 참조

expr이 lvalue면 T와 param 모두 lvalue 참조로 추론된다.

expr이 rvalue면 앞서 나온, 1번 경우의 룰이 적용된다.
CHAPTER 1. 형식 연역
ITEM 1 : 템플릿 형식 연역 규칙을 숙지하라
template<typename T>
void f(T&& param);
int x = 27;
const int cx = x;
const int& rx = x;
f(x); // x: lvalue , T: int& , param: int&
f(cx); // cx: lvalue , T: const int& , param: const int&
f(rx); // rx: lvalue , T: const int& , param: const int&
f(27); // 27: rvalue , T: int , param: int&&
1. param의 선언은 rvalue 참조와 같은 모습이지만, expr이 lvalue이면 rvalue 참조와는 전혀 다른 방식으로 추론한다.
2. 참조 타입으로 추론되는 템플릿 T는 expr이 lvalue일 때가 유일하다.

3. expr이 lvalue일 때, param의 선언은 rvalue참조같은 모습이지만 추론된 타입은 lvalue 참조이다.
CHAPTER 1. 형식 연역
ITEM 1 : 템플릿 형식 연역 규칙을 숙지하라
3. ParamType이 포인터도, 참조도 아님

인수가 함수에 pass-by-value되는 상황이기 때문에

param은 새로운 객체가 된다. 그래서 

‣ expr의 타입이 참조면 참조 부분은 무시함.

‣ expr의 참조성을 무시하고 expr이 const면 const도 무시함.

‣ expr이 volatile이면 volatile도 무시함.
CHAPTER 1. 형식 연역
ITEM 1 : 템플릿 형식 연역 규칙을 숙지하라
template<typename T>
void f(T param);
const int cx = x;
const int& rx = x;
const char* const ptr
= “Fun With pointers”; // ptr은 const 객체를 가리키는 const 포인터
f(x); // T: int , param: int
f(cx); // T: int , param: int
f(rx); // T: int , param: int
f(ptr); // param: const char* (const char * const 형식의 인수 전달)
1. param은 받는 인수들의 복사본이기 때문에 const가 무시당하는 것은 당연한 결과이다.

2. 그러나 const가 pass-by-value 매개변수에 대해서만 무시당한다. 

const에 대한 참조나 포인터인 매개변수는 타입 추론 과정에서 const성이 보존된다.

3. f(ptr)을 보면, param에는 포인터를 구성하는 비트들이 복사되며 그 과정에서 ptr의 const성은 무시된다.

즉, 추론 과정에서 ptr이 가리키는 것의 const는 보존되나, ptr 자체의 const는 새 포인터 param을 생성하는 도중에
사라진다.
CHAPTER 1. 형식 연역
ITEM 1 : 템플릿 형식 연역 규칙을 숙지하라
4. 그 외 틈새 상황들. (대부분의 경우는 위의 3가지임)

A. 배열 인수

B. 함수 인수
CHAPTER 1. 형식 연역
ITEM 1 : 템플릿 형식 연역 규칙을 숙지하라
A. 배열 인수

배열과 포인터를 구분하지 않고 사용할 수 있는 경우가 있지만,

배열 형식은 포인터 형식과 다르다.

문제는 배열이 배열의 첫 원소를 가리키는 포인터로 붕괴(decay)
한다는 점이다.
CHAPTER 1. 형식 연역
ITEM 1 : 템플릿 형식 연역 규칙을 숙지하라
template<typename T>
void f(T param);
void f2(T& param);
void myFunc1(int param[]);
void myFunc2(int* param);
const char name[] = "J. P. Briggs"; // name: const char[13]
const char * ptrToName = name; // array decays into a pointer
f(name);
1. name( const char[13] )과 ptrToName( const char* )는 같지 않지만 배열의 붕괴때문에 잘 컴파일된다.

2. 배열 형식의 함수 매개변수는 없다. myFunc1에서 배열 선언은 myFunc2처럼 포인터 선언으로 취급된다.

3. 그래서 f(name)을 호출하면 name은 배열이지만 T는 const char* 로 추론된다.

4. 하지만 f2처럼 참조로 선언하고 f2(name)을 실행한다면 T는 실제 배열로 추론된다. 그래서 T는 const char[13]으
로, f2의 param은 const char (&)[13]으로 추론된다.
CHAPTER 1. 형식 연역
ITEM 1 : 템플릿 형식 연역 규칙을 숙지하라
B. 함수 인수

함수 타입도 함수 포인터로 붕괴할 수 있다. 앞의 배열 인수에서 설
명했던 것들이 함수 인수에도 적용된다.
CHAPTER 1. 형식 연역
ITEM 1 : 템플릿 형식 연역 규칙을 숙지하라
template<typename T>
void f1(T param); // pass-by-value
template<typename T>
void f2(T& param); // pass-by-reference
void someFunc(int, double);
f1(someFunc); // param: function pointer - void (*)(int, double)
f2(someFunc); // param: function reference - void (&)(int, double)

More Related Content

What's hot

[SwiftStudy 2016] 3장. 함수
[SwiftStudy 2016] 3장. 함수[SwiftStudy 2016] 3장. 함수
[SwiftStudy 2016] 3장. 함수Keunhyun Oh
 
데이터베이스 정규화
데이터베이스 정규화데이터베이스 정규화
데이터베이스 정규화Hoyoung Jung
 
[SwiftStudy 2016] 2장. Swift 타입 파트 1
[SwiftStudy 2016] 2장. Swift 타입 파트 1[SwiftStudy 2016] 2장. Swift 타입 파트 1
[SwiftStudy 2016] 2장. Swift 타입 파트 1Keunhyun Oh
 
[C++ korea] effective modern c++ study item 1정은식
[C++ korea] effective modern c++ study item 1정은식[C++ korea] effective modern c++ study item 1정은식
[C++ korea] effective modern c++ study item 1정은식은식 정
 
[C++ korea] effective modern c++ study item 1 understand template type dedu...
[C++ korea] effective modern c++ study   item 1 understand template type dedu...[C++ korea] effective modern c++ study   item 1 understand template type dedu...
[C++ korea] effective modern c++ study item 1 understand template type dedu...Seok-joon Yun
 
[C++ korea] effective modern c++ study item 2 understanding auto type deduc...
[C++ korea] effective modern c++ study   item 2 understanding auto type deduc...[C++ korea] effective modern c++ study   item 2 understanding auto type deduc...
[C++ korea] effective modern c++ study item 2 understanding auto type deduc...Seok-joon Yun
 
모어 이펙티브 c++ 1,2장 스터디
모어 이펙티브 c++ 1,2장 스터디모어 이펙티브 c++ 1,2장 스터디
모어 이펙티브 c++ 1,2장 스터디quxn6
 
Ruby - 6th (루비 6장 변수와 식)
Ruby - 6th (루비 6장 변수와 식)Ruby - 6th (루비 6장 변수와 식)
Ruby - 6th (루비 6장 변수와 식)재영 이
 
effective c++ chapter 3~4 정리
effective c++ chapter 3~4 정리effective c++ chapter 3~4 정리
effective c++ chapter 3~4 정리Injae Lee
 
More effective c++ chapter1 2_dcshin
More effective c++ chapter1 2_dcshinMore effective c++ chapter1 2_dcshin
More effective c++ chapter1 2_dcshinDong Chan Shin
 
Effective c++ 4
Effective c++ 4Effective c++ 4
Effective c++ 4현찬 양
 
Secure coding-c-dcl-1
Secure coding-c-dcl-1Secure coding-c-dcl-1
Secure coding-c-dcl-1Seungyong Lee
 
More effective c++ 2
More effective c++ 2More effective c++ 2
More effective c++ 2현찬 양
 
More effective c++ 1
More effective c++ 1More effective c++ 1
More effective c++ 1현찬 양
 
Start IoT with JavaScript - 4.객체1
Start IoT with JavaScript - 4.객체1Start IoT with JavaScript - 4.객체1
Start IoT with JavaScript - 4.객체1Park Jonggun
 
More effective c++ 항목30부터
More effective c++ 항목30부터More effective c++ 항목30부터
More effective c++ 항목30부터Dong Chan Shin
 
Start IoT with JavaScript - 2.연산자
Start IoT with JavaScript - 2.연산자Start IoT with JavaScript - 2.연산자
Start IoT with JavaScript - 2.연산자Park Jonggun
 
Effective c++ 1
Effective c++ 1Effective c++ 1
Effective c++ 1현찬 양
 

What's hot (20)

[SwiftStudy 2016] 3장. 함수
[SwiftStudy 2016] 3장. 함수[SwiftStudy 2016] 3장. 함수
[SwiftStudy 2016] 3장. 함수
 
데이터베이스 정규화
데이터베이스 정규화데이터베이스 정규화
데이터베이스 정규화
 
[SwiftStudy 2016] 2장. Swift 타입 파트 1
[SwiftStudy 2016] 2장. Swift 타입 파트 1[SwiftStudy 2016] 2장. Swift 타입 파트 1
[SwiftStudy 2016] 2장. Swift 타입 파트 1
 
[C++ korea] effective modern c++ study item 1정은식
[C++ korea] effective modern c++ study item 1정은식[C++ korea] effective modern c++ study item 1정은식
[C++ korea] effective modern c++ study item 1정은식
 
[C++ korea] effective modern c++ study item 1 understand template type dedu...
[C++ korea] effective modern c++ study   item 1 understand template type dedu...[C++ korea] effective modern c++ study   item 1 understand template type dedu...
[C++ korea] effective modern c++ study item 1 understand template type dedu...
 
Java generics
Java genericsJava generics
Java generics
 
[C++ korea] effective modern c++ study item 2 understanding auto type deduc...
[C++ korea] effective modern c++ study   item 2 understanding auto type deduc...[C++ korea] effective modern c++ study   item 2 understanding auto type deduc...
[C++ korea] effective modern c++ study item 2 understanding auto type deduc...
 
모어 이펙티브 c++ 1,2장 스터디
모어 이펙티브 c++ 1,2장 스터디모어 이펙티브 c++ 1,2장 스터디
모어 이펙티브 c++ 1,2장 스터디
 
Ruby - 6th (루비 6장 변수와 식)
Ruby - 6th (루비 6장 변수와 식)Ruby - 6th (루비 6장 변수와 식)
Ruby - 6th (루비 6장 변수와 식)
 
effective c++ chapter 3~4 정리
effective c++ chapter 3~4 정리effective c++ chapter 3~4 정리
effective c++ chapter 3~4 정리
 
More effective c++ chapter1 2_dcshin
More effective c++ chapter1 2_dcshinMore effective c++ chapter1 2_dcshin
More effective c++ chapter1 2_dcshin
 
Effective c++ 4
Effective c++ 4Effective c++ 4
Effective c++ 4
 
Secure coding-c-dcl-1
Secure coding-c-dcl-1Secure coding-c-dcl-1
Secure coding-c-dcl-1
 
More effective c++ 2
More effective c++ 2More effective c++ 2
More effective c++ 2
 
More effective c++ 1
More effective c++ 1More effective c++ 1
More effective c++ 1
 
Start IoT with JavaScript - 4.객체1
Start IoT with JavaScript - 4.객체1Start IoT with JavaScript - 4.객체1
Start IoT with JavaScript - 4.객체1
 
More effective c++ 항목30부터
More effective c++ 항목30부터More effective c++ 항목30부터
More effective c++ 항목30부터
 
Start IoT with JavaScript - 2.연산자
Start IoT with JavaScript - 2.연산자Start IoT with JavaScript - 2.연산자
Start IoT with JavaScript - 2.연산자
 
5 6 1
5 6 15 6 1
5 6 1
 
Effective c++ 1
Effective c++ 1Effective c++ 1
Effective c++ 1
 

Viewers also liked

C#으로 게임 엔진 만들기(3)
C#으로 게임 엔진 만들기(3)C#으로 게임 엔진 만들기(3)
C#으로 게임 엔진 만들기(3)지환 김
 
Json for modern c++
Json for modern c++Json for modern c++
Json for modern c++지환 김
 
C#으로 게임 엔진 만들기(2)
C#으로 게임 엔진 만들기(2)C#으로 게임 엔진 만들기(2)
C#으로 게임 엔진 만들기(2)지환 김
 
C#으로 게임 엔진 만들기(1)
C#으로 게임 엔진 만들기(1)C#으로 게임 엔진 만들기(1)
C#으로 게임 엔진 만들기(1)지환 김
 
rkskekfkakqktkdk
rkskekfkakqktkdkrkskekfkakqktkdk
rkskekfkakqktkdk지은 연
 
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)Dong Chan Shin
 
Hazmat suits and content zero: How I learned to study digital marketing like ...
Hazmat suits and content zero: How I learned to study digital marketing like ...Hazmat suits and content zero: How I learned to study digital marketing like ...
Hazmat suits and content zero: How I learned to study digital marketing like ...Jessica Hale
 
Blogger did you know!
Blogger   did you know!Blogger   did you know!
Blogger did you know!JustyC
 
A hybrid cloud approach for secure authorized deduplication
A hybrid cloud approach for secure authorized deduplicationA hybrid cloud approach for secure authorized deduplication
A hybrid cloud approach for secure authorized deduplicationLeMeniz Infotech
 
Артем Чучакин (Идея Нова) о ботах и мертвых душах в социальных медиа
Артем Чучакин (Идея Нова) о ботах и мертвых душах в социальных медиаАртем Чучакин (Идея Нова) о ботах и мертвых душах в социальных медиа
Артем Чучакин (Идея Нова) о ботах и мертвых душах в социальных медиаEkaterina Giganova
 
Riverside Resources Corporate Presentation
Riverside Resources Corporate PresentationRiverside Resources Corporate Presentation
Riverside Resources Corporate Presentationmhallaran
 
Hybrid modulated extended secondary universal current fed zvs converter for w...
Hybrid modulated extended secondary universal current fed zvs converter for w...Hybrid modulated extended secondary universal current fed zvs converter for w...
Hybrid modulated extended secondary universal current fed zvs converter for w...LeMeniz Infotech
 
педмарафон 2013
педмарафон 2013педмарафон 2013
педмарафон 2013Elena Loseva
 
Wave 2 - Mobility | UM | Social Media Tracker
Wave 2  - Mobility | UM | Social Media TrackerWave 2  - Mobility | UM | Social Media Tracker
Wave 2 - Mobility | UM | Social Media TrackerUM Wave
 
Sanatana Resources Corporate Presentation
Sanatana Resources Corporate PresentationSanatana Resources Corporate Presentation
Sanatana Resources Corporate Presentationmhallaran
 

Viewers also liked (20)

C#으로 게임 엔진 만들기(3)
C#으로 게임 엔진 만들기(3)C#으로 게임 엔진 만들기(3)
C#으로 게임 엔진 만들기(3)
 
Json for modern c++
Json for modern c++Json for modern c++
Json for modern c++
 
C#으로 게임 엔진 만들기(2)
C#으로 게임 엔진 만들기(2)C#으로 게임 엔진 만들기(2)
C#으로 게임 엔진 만들기(2)
 
C#으로 게임 엔진 만들기(1)
C#으로 게임 엔진 만들기(1)C#으로 게임 엔진 만들기(1)
C#으로 게임 엔진 만들기(1)
 
Easyloggingpp
EasyloggingppEasyloggingpp
Easyloggingpp
 
7 8 1
7 8 17 8 1
7 8 1
 
rkskekfkakqktkdk
rkskekfkakqktkdkrkskekfkakqktkdk
rkskekfkakqktkdk
 
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
 
Hazmat suits and content zero: How I learned to study digital marketing like ...
Hazmat suits and content zero: How I learned to study digital marketing like ...Hazmat suits and content zero: How I learned to study digital marketing like ...
Hazmat suits and content zero: How I learned to study digital marketing like ...
 
Blogger did you know!
Blogger   did you know!Blogger   did you know!
Blogger did you know!
 
Images
ImagesImages
Images
 
604 2441-1-pb
604 2441-1-pb604 2441-1-pb
604 2441-1-pb
 
A hybrid cloud approach for secure authorized deduplication
A hybrid cloud approach for secure authorized deduplicationA hybrid cloud approach for secure authorized deduplication
A hybrid cloud approach for secure authorized deduplication
 
Артем Чучакин (Идея Нова) о ботах и мертвых душах в социальных медиа
Артем Чучакин (Идея Нова) о ботах и мертвых душах в социальных медиаАртем Чучакин (Идея Нова) о ботах и мертвых душах в социальных медиа
Артем Чучакин (Идея Нова) о ботах и мертвых душах в социальных медиа
 
Riverside Resources Corporate Presentation
Riverside Resources Corporate PresentationRiverside Resources Corporate Presentation
Riverside Resources Corporate Presentation
 
Hybrid modulated extended secondary universal current fed zvs converter for w...
Hybrid modulated extended secondary universal current fed zvs converter for w...Hybrid modulated extended secondary universal current fed zvs converter for w...
Hybrid modulated extended secondary universal current fed zvs converter for w...
 
педмарафон 2013
педмарафон 2013педмарафон 2013
педмарафон 2013
 
Enp 181 Magazin
Enp 181 MagazinEnp 181 Magazin
Enp 181 Magazin
 
Wave 2 - Mobility | UM | Social Media Tracker
Wave 2  - Mobility | UM | Social Media TrackerWave 2  - Mobility | UM | Social Media Tracker
Wave 2 - Mobility | UM | Social Media Tracker
 
Sanatana Resources Corporate Presentation
Sanatana Resources Corporate PresentationSanatana Resources Corporate Presentation
Sanatana Resources Corporate Presentation
 

Similar to [Effective Modern C++] Chapter1 - item1

C++ Advanced 강의 3주차
C++ Advanced 강의 3주차C++ Advanced 강의 3주차
C++ Advanced 강의 3주차HyunJoon Park
 
2014-15 Intermediate C++ Study #7
2014-15 Intermediate C++ Study #72014-15 Intermediate C++ Study #7
2014-15 Intermediate C++ Study #7Chris Ohk
 
Modern Effective C++ Item2 Understanding Auto type deducing
Modern Effective C++ Item2 Understanding Auto type deducingModern Effective C++ Item2 Understanding Auto type deducing
Modern Effective C++ Item2 Understanding Auto type deducing건 손
 
[C++ Korea] Effective Modern C++ Study, Item 1 - 3
[C++ Korea] Effective Modern C++ Study, Item 1 - 3[C++ Korea] Effective Modern C++ Study, Item 1 - 3
[C++ Korea] Effective Modern C++ Study, Item 1 - 3Chris Ohk
 
[아꿈사] The C++ Programming Language 13장 템플릿
[아꿈사] The C++ Programming Language 13장 템플릿[아꿈사] The C++ Programming Language 13장 템플릿
[아꿈사] The C++ Programming Language 13장 템플릿해강
 
2013 C++ Study For Students #1
2013 C++ Study For Students #12013 C++ Study For Students #1
2013 C++ Study For Students #1Chris Ohk
 
연산자 오버로딩
연산자 오버로딩연산자 오버로딩
연산자 오버로딩수빈 박
 
NHNNEXT 개경프14 Subway Rocket Team Study 3rd C++
NHNNEXT 개경프14 Subway Rocket Team Study 3rd C++NHNNEXT 개경프14 Subway Rocket Team Study 3rd C++
NHNNEXT 개경프14 Subway Rocket Team Study 3rd C++Min-soo Park
 
이펙티브 C++ (7~9)
이펙티브 C++ (7~9)이펙티브 C++ (7~9)
이펙티브 C++ (7~9)익성 조
 
C++ Template/STL study
C++ Template/STL studyC++ Template/STL study
C++ Template/STL studySeo Dong-yu
 
Abstract syntax semantic analyze
Abstract syntax semantic analyzeAbstract syntax semantic analyze
Abstract syntax semantic analyzeHyunJoon Park
 

Similar to [Effective Modern C++] Chapter1 - item1 (13)

C++ Advanced 강의 3주차
C++ Advanced 강의 3주차C++ Advanced 강의 3주차
C++ Advanced 강의 3주차
 
Haskell study 3
Haskell study 3Haskell study 3
Haskell study 3
 
2014-15 Intermediate C++ Study #7
2014-15 Intermediate C++ Study #72014-15 Intermediate C++ Study #7
2014-15 Intermediate C++ Study #7
 
Modern Effective C++ Item2 Understanding Auto type deducing
Modern Effective C++ Item2 Understanding Auto type deducingModern Effective C++ Item2 Understanding Auto type deducing
Modern Effective C++ Item2 Understanding Auto type deducing
 
[C++ Korea] Effective Modern C++ Study, Item 1 - 3
[C++ Korea] Effective Modern C++ Study, Item 1 - 3[C++ Korea] Effective Modern C++ Study, Item 1 - 3
[C++ Korea] Effective Modern C++ Study, Item 1 - 3
 
[아꿈사] The C++ Programming Language 13장 템플릿
[아꿈사] The C++ Programming Language 13장 템플릿[아꿈사] The C++ Programming Language 13장 템플릿
[아꿈사] The C++ Programming Language 13장 템플릿
 
2013 C++ Study For Students #1
2013 C++ Study For Students #12013 C++ Study For Students #1
2013 C++ Study For Students #1
 
Python
PythonPython
Python
 
연산자 오버로딩
연산자 오버로딩연산자 오버로딩
연산자 오버로딩
 
NHNNEXT 개경프14 Subway Rocket Team Study 3rd C++
NHNNEXT 개경프14 Subway Rocket Team Study 3rd C++NHNNEXT 개경프14 Subway Rocket Team Study 3rd C++
NHNNEXT 개경프14 Subway Rocket Team Study 3rd C++
 
이펙티브 C++ (7~9)
이펙티브 C++ (7~9)이펙티브 C++ (7~9)
이펙티브 C++ (7~9)
 
C++ Template/STL study
C++ Template/STL studyC++ Template/STL study
C++ Template/STL study
 
Abstract syntax semantic analyze
Abstract syntax semantic analyzeAbstract syntax semantic analyze
Abstract syntax semantic analyze
 

[Effective Modern C++] Chapter1 - item1

  • 1. CHAPTER 1 EFFECTIVE MODERN C++ 김지환
 mastrayer@naver.com
  • 2. CHAPTER 1. 형식 연역 DEDUCING TYPES 형식 연역 = 타입 추론(type deduction) 현대적인 C++에서는 auto, decltype, 템플릿 호출 지점에서 형식 연역이 일어난다.
  • 3. CHAPTER 1. 형식 연역 ITEM 1 : 템플릿 형식 연역 규칙을 숙지하라 이 코드에서 컴파일러는 expr을 이용해 
 두가지 타입(T, param)을 추론함. 이 두 형식이 다를 경우가 많은데 
 const, &같은 수식어들이 붙기 때문. 타입이 추론되는 경우는 3가지가 있다. template<typename T> void f(const T& param); int expr = 0; f(expr); // T : int // ParamType : const int&
  • 4. CHAPTER 1. 형식 연역 ITEM 1 : 템플릿 형식 연역 규칙을 숙지하라 1. ParamType이 참조 타입이지만 보편 참조는 아닌 경우 만일 expr이 참조 형식이면 참조 부분을 무시 expr의 타입을 ParamType에 대해 패턴 매칭으로 대응시켜 T의 타입을 결정
  • 5. CHAPTER 1. 형식 연역 ITEM 1 : 템플릿 형식 연역 규칙을 숙지하라 template<typename T> void f(T& param); int x = 27; const int cx = x; const int& rx = x; f(x); // T: int , param: int& f(cx); // T: const int , param: const int& f(rx); // T: const int , param: const int& 1. f(cx)를 보면, 객체의 const성은 T에 대해 추론된 형식의 일부가 된다. 2. f(rx)를 보면, rx는 참조 타입이지만 추론 과정에서 참조성이 무시되기 때문에 T는 비참조 타입으로 추론된다.
  • 6. CHAPTER 1. 형식 연역 ITEM 1 : 템플릿 형식 연역 규칙을 숙지하라 template<typename T> void f(const T& param); int x = 27; const int cx = x; const int& rx = x; f(x); // T: int , param: const int& f(cx); // T: int , param: const int& f(rx); // T: int , param: const int& 1. 이제는 param이 const에 대한 참조로 간주되므로, const가 T의 일부로 추론될 필요가 없다. 2. 그래서 f(cx)를 보면 T는 int로 추론되었다. 3. 마찬가지로 f(rx)도 T는 int로 추론되고 rx의 참조성은 무시된다.
  • 7. CHAPTER 1. 형식 연역 ITEM 1 : 템플릿 형식 연역 규칙을 숙지하라 2. ParamType이 보편 참조 expr이 lvalue면 T와 param 모두 lvalue 참조로 추론된다. expr이 rvalue면 앞서 나온, 1번 경우의 룰이 적용된다.
  • 8. CHAPTER 1. 형식 연역 ITEM 1 : 템플릿 형식 연역 규칙을 숙지하라 template<typename T> void f(T&& param); int x = 27; const int cx = x; const int& rx = x; f(x); // x: lvalue , T: int& , param: int& f(cx); // cx: lvalue , T: const int& , param: const int& f(rx); // rx: lvalue , T: const int& , param: const int& f(27); // 27: rvalue , T: int , param: int&& 1. param의 선언은 rvalue 참조와 같은 모습이지만, expr이 lvalue이면 rvalue 참조와는 전혀 다른 방식으로 추론한다. 2. 참조 타입으로 추론되는 템플릿 T는 expr이 lvalue일 때가 유일하다. 3. expr이 lvalue일 때, param의 선언은 rvalue참조같은 모습이지만 추론된 타입은 lvalue 참조이다.
  • 9. CHAPTER 1. 형식 연역 ITEM 1 : 템플릿 형식 연역 규칙을 숙지하라 3. ParamType이 포인터도, 참조도 아님 인수가 함수에 pass-by-value되는 상황이기 때문에
 param은 새로운 객체가 된다. 그래서 ‣ expr의 타입이 참조면 참조 부분은 무시함. ‣ expr의 참조성을 무시하고 expr이 const면 const도 무시함. ‣ expr이 volatile이면 volatile도 무시함.
  • 10. CHAPTER 1. 형식 연역 ITEM 1 : 템플릿 형식 연역 규칙을 숙지하라 template<typename T> void f(T param); const int cx = x; const int& rx = x; const char* const ptr = “Fun With pointers”; // ptr은 const 객체를 가리키는 const 포인터 f(x); // T: int , param: int f(cx); // T: int , param: int f(rx); // T: int , param: int f(ptr); // param: const char* (const char * const 형식의 인수 전달) 1. param은 받는 인수들의 복사본이기 때문에 const가 무시당하는 것은 당연한 결과이다. 2. 그러나 const가 pass-by-value 매개변수에 대해서만 무시당한다. 
 const에 대한 참조나 포인터인 매개변수는 타입 추론 과정에서 const성이 보존된다. 3. f(ptr)을 보면, param에는 포인터를 구성하는 비트들이 복사되며 그 과정에서 ptr의 const성은 무시된다.
 즉, 추론 과정에서 ptr이 가리키는 것의 const는 보존되나, ptr 자체의 const는 새 포인터 param을 생성하는 도중에 사라진다.
  • 11. CHAPTER 1. 형식 연역 ITEM 1 : 템플릿 형식 연역 규칙을 숙지하라 4. 그 외 틈새 상황들. (대부분의 경우는 위의 3가지임) A. 배열 인수 B. 함수 인수
  • 12. CHAPTER 1. 형식 연역 ITEM 1 : 템플릿 형식 연역 규칙을 숙지하라 A. 배열 인수 배열과 포인터를 구분하지 않고 사용할 수 있는 경우가 있지만,
 배열 형식은 포인터 형식과 다르다. 문제는 배열이 배열의 첫 원소를 가리키는 포인터로 붕괴(decay) 한다는 점이다.
  • 13. CHAPTER 1. 형식 연역 ITEM 1 : 템플릿 형식 연역 규칙을 숙지하라 template<typename T> void f(T param); void f2(T& param); void myFunc1(int param[]); void myFunc2(int* param); const char name[] = "J. P. Briggs"; // name: const char[13] const char * ptrToName = name; // array decays into a pointer f(name); 1. name( const char[13] )과 ptrToName( const char* )는 같지 않지만 배열의 붕괴때문에 잘 컴파일된다. 2. 배열 형식의 함수 매개변수는 없다. myFunc1에서 배열 선언은 myFunc2처럼 포인터 선언으로 취급된다. 3. 그래서 f(name)을 호출하면 name은 배열이지만 T는 const char* 로 추론된다. 4. 하지만 f2처럼 참조로 선언하고 f2(name)을 실행한다면 T는 실제 배열로 추론된다. 그래서 T는 const char[13]으 로, f2의 param은 const char (&)[13]으로 추론된다.
  • 14. CHAPTER 1. 형식 연역 ITEM 1 : 템플릿 형식 연역 규칙을 숙지하라 B. 함수 인수 함수 타입도 함수 포인터로 붕괴할 수 있다. 앞의 배열 인수에서 설 명했던 것들이 함수 인수에도 적용된다.
  • 15. CHAPTER 1. 형식 연역 ITEM 1 : 템플릿 형식 연역 규칙을 숙지하라 template<typename T> void f1(T param); // pass-by-value template<typename T> void f2(T& param); // pass-by-reference void someFunc(int, double); f1(someFunc); // param: function pointer - void (*)(int, double) f2(someFunc); // param: function reference - void (&)(int, double)