#1. [모던 C++] 주요 구성 요소 미리보기(C++11, C++14, C++17, C++20)
모던 C++ 은 현대적인 언어 특성에 발맞춰 좀더 단순하게 코딩할 수 있도록 개선되었습니다.(모던 C++ STL의 변경 내용은 [모던 C++ STL] 주요 구성 요소 미리보기를 참고하시기 바랍니다.)
모던 C++ 은 현대적인 언어 특성에 발맞춰 좀더 단순하게 코딩할 수 있도록 개선되었습니다.(모던 C++ STL의 변경 내용은 [모던 C++ STL] 주요 구성 요소 미리보기를 참고하시기 바랍니다.)
[MEC++#8] 0과 NULL 보단 nullptr를 선호하라.(nullptr 참고) [MEC++#9] typedef 보다 using을 이용한 타입 별칭을 선호하라.(클래스 템플릿 별칭 참고)
(C++11~) 사용자 정의 리터럴이 추가되어 int operator ""_km(long double val);와 같이 사용자가 정의해서 사용할 수 있으며, 단위계 처리가 쉬워졌습니다. (C++20~) 사용자 정의 리터럴 인자 규칙에 char8_t이 추가되었습...
(C++11~) 인라인 네임스페이스가 추가되어 API 버전 구성이 편리해 졌습니다. (C++17~) 단순한 중첩 네임스페이스가 추가되어 :: 로 표현할 수 있습니다. (C++20~) 인라인 네임스페이스와 단순한 중첩 네임스페이스를 결합하여 표시할 수 있...
[MEC++#7] 객체 생성시 괄호와 중괄호를 구분하라.(인자의 암시적 형변환 차단, 기존 생성자와 initializer_list 생성자와의 충돌 참고)
(C++11~) 범위 기반 for()가 추가되어 컨테이너 요소의 탐색 처리가 쉬워졌습니다. (C++17~) 초기식을 포함하는 if(), switch()가 추가되어 함수 리턴값을 평가하고 소멸하는 코드가 단순해 졌습니다. (C++20~) 범위 기반 fo...
[MEC++#11] 정의되지 않은 비공개 함수보다 delete된 함수를 선호하라.(delete를 이용한 암시적 형변환과 템플릿 인스턴스화 차단 참고) [MEC++#12] 재정의 함수들을 override로 선언하라.(override 참고)
(C++11~) explicit 형변환 연산자가 추가되어 명시적으로 형변환 할 수 있습니다. (C++20~) explicit(bool)이 추가되어 특정 조건일 때만 explicit로 동작하게 할 수 있습니다.
[MEC++#14] 예외를 방출하지 않을 함수는 noexcept로 선언하라.(느슨한 noexcept 계약 참고) noexcept는 최적화 여지가 크다. 이동 생성자, 이동 대입 연산자, swap(), 소멸자는 noexcept로 만들어라. ...
[MEC++#1] 함수 템플릿 인수 추론을 숙지하라.(함수 템플릿 인수 추론 참고) 참조성은 제거된다. 배열은 포인터로 붕괴된다. 함수는 함수 포인터로 변경된다. 최상위 const 는 무시된다. ...
[MEC++#17] 암시적으로 정의되는 특수 멤버 함수들의 자동 작성 조건을 숙지하라.(이동 연산에 따른 암시적 정의 참고) [MEC++#29] 이동 연산이 존재하지 않고, 저렴하지 않고, 적용되지 않는다고 가정하라.(암시적 이동 연산 변환 참고) ...
(C++11~) 멤버 함수 참조 지정자가 추가되어 멤버 함수에 &, && 로 좌측값에서 호출될때와 우측값에서 호출될 때를 구분하여 함수 오버로딩을 할 수 있습니다.
[MEC++#23] move()와 forward()를 숙지하라.(move 원리, 상수 개체의 move(). forward() 와 완벽한 전달, forward() 원리 참고) [MEC++#24] 전달 참조와 우측값 참조를 구별하라.(전달 참조 참고) [M...
[MEC++#10] 범위 없는 열거형보다 범위 있는 열거형을 선호하라.(열거형의 암시적 형변환, 전방 선언, 기반 타입 참고)
(C++11~) 무제한 공용체가 추가되어 공용체 멤버에서 생성자/소멸자/가상 함수 사용 제한이 풀렸으며, 메모리 절약을 위한 코딩 자유도가 높아졌습니다.
[MEC++#31] 기본 람다 캡쳐 모드를 피하라.(람다 캡쳐 참고) 람다 캡쳐하는 항목을 나열하는게 직관적이다. [=]는 this를 람다 캡쳐한다. [MEC++#32] 객체를 클로저 안으로 이동시...
(C++11~) static_assert()가 추가되어 컴파일 타임 진단이 가능해 졌습니다. (C++17~) static_assert()의 메시지 생략을 지원합니다.
[MEC++#15] 가능하면 항상 constexpr을 사용하라.(constexpr 함수 참고) constexpr 함수는 컴파일 타임, 런타임 모두 사용할 수 있다.
(C++11~) extern으로 템플릿 선언을 할 수 있으며, 템플릿 인스턴스 중복 생성을 없앨 수 있습니다. (C++11~) 템플릿 오른쪽 꺽쇠 괄호 파싱을 개선하여 템플릿 인스턴스화시 >가 중첩되어 >>와 같이 되더라도 공백을 추가할 필요가...
(C++11~) 가변 템플릿과 파라메터 팩이 추가되어, 가변 인자(…)와 같이 갯수와 타입이 정해 지지 않은 템플릿 인자를 사용할 수 있습니다. (C++11~) sizeof…() 연산자가 추가되어 가변 템플릿에서 파라메터 팩의 인자수를 구할 수 있습니다. ...
(C++11~) 특성(attirbute)이 추가되어 컴파일러에게 부가 정보를 전달하는 방식을 표준화 했습니다. (C++14~) [[deprecated]]가 추가되어 소멸 예정인 것을 컴파일 경고로 알려줍니다. (C++17~) [[fallthrough]]...
(C++17~) 임시 구체화와 복사 생략 보증을 통해 컴파일러 의존적이었던 생성자 호출 및 함수 인수 전달 최적화, 리턴값 최적화등이 표준화 되었습니다.
(C++17~) 인라인 변수가 추가되어 헤더 파일에 정의된 변수를 여러개의 cpp에서 #include 하더라도 중복 정의 없이 사용할 수 있습니다. 또한, 클래스 정적 멤버 변수를 선언부에서 초기화 할 수 있습니다.
(C++17~) 구조화된 바인딩이 추가되어 배열, pair, tuple, 클래스등의 내부 요소나 멤버 변수에 쉽게 접근할 수 있습니다.
(C++20~) 삼중 비교 연산자가 추가되어 비교 연산자 구현이 간소화 되었습니다. (C++20~) 삼중 비교 연산자를 default로 정의할 수 있습니다. (C++20~) 비트 쉬프트 연산자의 기본 비트가 표준화되어 << 1는 곱하기 2의 ...
(C++20~) 컨셉(concept)과 요구사항(requires)이 추가되어 템플릿 인자나 auto에 제약 조건(constraint)을 줄 수 있습니다. (C++20~) 컨셉 설계를 활용하여 마치 인터페이스처럼 컨셉에 의한 코딩 계약을 만들 수 있습니다.
(C++20~) 모듈이 추가되어 전처리 사용 방식을 개선하여 컴파일 속도를 향상시키고, #include 순서에 따른 종속성 문제, 선언과 정의 분리 구성의 불편함, 기호 충돌 문제를 해결했습니다.
(C++20~) 코루틴이 추가되어 함수의 일시 정지 후 재개가 가능합니다.
(C++11~) alignas() 와 alignof()가 추가되어 메모리 정렬 방식을 표준화 됐습니다. (C++11~) 가변 매크로가 추가되어 C언어와의 호환성이 높아졌습니다. (C++11~) 멤버의 sizeof()시 동작이 개선되어 개체를 인스턴스화 ...