Effective Modern C++Study
C++ Korea8
• 같은 이름을 가진 함수를 중복으로 선언
• 조건
- 인자 목록만 다르면 가능 (타입 종류 및 순서)
- 인자 이름은 상관없다.
- return 타입도 상관없다.
9.
Effective Modern C++Study
C++ Korea9
1. 기본타입은 const와의 공존을 거부한다.
void Func(int);
void Func(const int);
// error C2084: func 'void Func(int)' already
// has a body
天上天下唯我獨尊
10.
Effective Modern C++Study
C++ Korea10
2. Reference 와 Pointer는 const와의 공존이 가능하다.
void Func(int& a);
void Func(const int& a);
void Func(int* a);
void Func(const int* a);
11.
Effective Modern C++Study
C++ Korea11
3. 기본타입은 레퍼런스와의 공존도 거부한다.
당연히 const int& 역시 거부한다.
void Func(int);
void Func(int&);
void Func(const int&);
// error C2665: 'Func': none of the 3 overloads
// could convert all the argument types
天上天下唯我獨尊
12.
Effective Modern C++Study
C++ Korea12
http://en.cppreference.com/w/cpp/language/overload_resolution
더 자세히 알고 싶으시다면,
아래 Link를 참고
(내용이 많아요. 기회가 되면 번역해서 블로그에 올릴께요.)
Effective Modern C++Study
C++ Korea14
1. 모든 종류의 Raw Pointer로 암묵적 변환(Implicit casting)이 가능
nullptr은 int 타입이 아니며, std::nullptr_t 타입이다.
void func(int) {};
void func(bool) {};
void func(void*) {};
func(NULL); // calls func(int)
func(nullptr); // calls func(void*)
15.
Effective Modern C++Study
C++ Korea15
2. 가독성 (Readability) 향상
특히 auto랑 같이 사용한 경우
auto OBJ = FindObj();
if (OBJ == 0)
auto OBJ = FindObj();
if (OBJ == NULL)
auto OBJ = FindObj();
if (OBJ == nullptr)
숫자형 이겠지 ?
(int 라던지…)
숫자형인가 ?
포인터인가?
누가봐도 포인터다.
그래도 NULL을 쓰면 안되는건 아닌데…
16.
Effective Modern C++Study
C++ Korea16
그래도 NULL을 쓰면 안되는건 아닌데…
왜 꼭 nullptr을 쓰라고 하지 ?
안쓰면 안되는 경우가 있나 ?
Effective Modern C++Study
C++ Korea
#define NULL 0
int FuncSP(std::shared_ptr<Widget> SPW);
double FuncUP(std::unique_ptr<Widget> UPW);
bool FuncRP(Widget* RPW);
std::mutex MS, MU, MR;
using LOCK = std::lock_guard<std::mutex>; // C++11 : 조금 더 고급진 typedef
{
LOCK L(MS); // RAII 를 지원하는 lock_guard 로 Code를 고급지게
auto RET = FuncSP(0);
}{
LOCK L(MU);
auto RET = FuncUP(NULL);
}{
LOCK L(MR);
auto RET = FuncUP(nullptr);
}
19.
Effective Modern C++Study
C++ Korea
template<typename FUNC,
typename MUTEX,
typename PTR>
auto LockAndFunc(FUNC F, MUTEX& M, PTR P) -> decltype(F(P))
{
LOCK L(M);
return F(P);
}
20.
Effective Modern C++Study
C++ Korea
template<typename FUNC,
typename MUTEX,
typename PTR>
decltype(auto) LockAndFunc(FUNC F, MUTEX& M, PTR P)
{
LOCK L(M);
return F(P);
}
21.
Effective Modern C++Study
C++ Korea
auto RS = LockAndFunc(FuncSP, MS, 0); // error
auto RU = LockAndFunc(FuncUP, MU, NULL); // error
auto RR = LockAndFunc(FuncRP, MR, nullptr); // OK
//can’t convert int to std::shared_ptr<Widget>
O, NULL은 언제나 정수형으로 추론되기 때문에
절대로 std::shared_ptr<Widget> 같은 타입으로는 추론이 안된다.
23.
Effective Modern C++Study
C++ Korea23
• 0 과 NULL은 보다는 nullptr을 사용합시다.
• 정수형과 Pointer 타입의 Overloading을 피합시다.
http://devluna.blogspot.kr/2015/04/item-08-0-null-nullptr-mva-version.html
icysword77@gmail.com