C++/Effective Modern C++32 0과 NULL 보다 nullptr 리터럴 0은 int이며 포인터가 아니다. 또한 NULL도 포인터 형식이 아니다. C++98에서 0이나 NULL로 중복 적재 함수를 호출했을 때, 포인터를 받는 중복적재가 호출되는 일은 없다. void f(int); void f(bool); void f(void*); f(0);// f(void*)가 아닌 f(int) 호출 f(NULL);// 컴파일 되지 않을 수도 있지만, 보통은 f(int)호출 f(NULL)의 행동에 관련된 불확실성은 NULL의ㅏ 구체적인 형식을 구현의 재량에 맡긴 결과이다. 여기서 주목할 점은, 소스 코드의 외관상 의미(NULL, 즉 널 포인터로 f를 호출한다)와 실제 의미(널 포인터가 아닌 어떤 정수로 f를 호출한다)가 서로 모순된다는 것이다. nullptr의 장점은 정수 형식이 아니.. 2020. 6. 30. 객체 생성시 괄호와 중괄호의 구분 C++에서는 초기화 값을 괄호, 등호, 중괄호로 지정할 수 있고 등호와 중괄호를 함께 사용할 수 있는 경우도 많다. int x(0);// 초기치를 괄호로 감싼 예 int y = 0;// 초기치를 "=" 다음에 지정한 예 int z{ 0 };// 초기치를 중괄호로 감싼 예 int t = { 0 };// "="와 중괄호로 초기치를 지정한 예 대체로 C++은 등호와 중괄호 구문은 중괄호만 사용한 구문과 동일하게 취급한다. int같은 내장 형식에서 초기화와 배정은 학술정긴 차원에서만 차이가 나지만 사용자 정의 형식에서는 초기화와 배정이 각자 다른 함수들을 호출하기 때문에 둘을 구분해야 한다. Widget w1;// 기본 생성자를 호출 Widget w2 = w1;// 배정이 아님, 복사 생성자를 호출 w1 = w.. 2020. 6. 29. auto가 원치 않은 형식으로 연역될 때에는 명시적 형식의 초기치를 사용 auto가 원치 않는 형식으로 연역되는 예가 있다. std::vector features(const Widget& w); Widget w; bool highPriority = features(w)[5]; processWidget(w, highPriority); 위 코드에서는 정상적으로 작동한다. 하지만 highPriority를 auto로 대체하면 상황은 달라진다. std::vector의 operator[]가 돌려주는 것은 한 요소에 대한 참조가 아니라 std::vector::reference 형식의 객체이다. std::vector::reference가 존재하는 것은, std::vector이 자신의 bool들을 bool당 1비트의 압축된 형태로 표현하도록 명시되어 있기 때문이다. 그렇기 때문에 operat.. 2020. 6. 28. 명시적 형식 선언보다는 auto를 선호하라 C++11 부터는 auto 문법 덕분에 이 문제점들이 모두 사라졌다. auto 변수의 형식은 해당 초기치로부터 연역되므로, 반드시 초기치를 제공해야한다. int x1;// 문맥에 따라서 초기화 되지 않을 수 있음 auto x2;// 오류 : 초기치가 꼭 필요함 auto x3 = 0;// 양호함 : x3의 값이 정의됨 그리고 auto는 형식 연역을 사용하므로 컴파일러에만 있던 형식을 지정할 수 있다. auto derefUPLess = [](const std::unique_ptr& p1,// std::unique_ptr들이 가리키는 Widget const std::unique_ptr& p2)// 객체들을 비교하는 함수 { return *p1 < *p2; }; auto derefLess = [](const a.. 2020. 6. 27. 연역된 형식을 파악하는 방법 IDE 편집기 일반적으로 간단한 형식의 경우에는 IDE가 알려준 정보가 쓸만하다. 컴파일러의 진단 메시지 컴파일러가 연역한 형식을 파악할 때 원하는 형식 때문에 컴파일에 문제가 발생하게 만드는 것이다. const int theAnswer = 42; auto x = theAnswer; auto y = &theAnswer; template class TD; TD xType; TD yType; 컴파일러마다 형태는 다르지만 동일한 정보를 제공하게 된다. 실행시점 출력 std::cout 2020. 6. 26. decltype의 작동 방식 decltype은 주어진 이름이나 표현식의 형식을 알려준다. 대부분의 경우 decltype은 주어진 이름이나 표현식의 구체적인 형식을 그대로 말해준다. const int i = 0; // decltype(i)는 const int bool f(const Widget& w); // decltype(w)는 const Widget&, decltype(f)는 bool(const Widget&) struct Point { int x, y; // decltype(Point::x) 는 int, decltype(Point::y)는 int }; Widget w; // decltype(w)는 Widget if (f(w)) ... // decltype(f(w))는 bool template // std::vector를 단순화한.. 2020. 6. 26. 이전 1 2 3 4 5 6 다음