C++17
1. 개요
C++17은 2017년 12월에 출시된 C++ 프로그래밍 언어의 표준 개정판이다. C++17은 C++11과 C++14에 이어 3년 주기로 릴리스되는 표준의 일환으로, 트라이그래프, 일부 더 이상 사용되지 않는 기능, `register` 키워드 등이 제거되었다. 새로운 기능으로는 언어적 측면에서 `static_assert` 개선, 템플릿 및 attribute 추가, UTF-8 문자 리터럴, 16진수 부동소수점 리터럴 지원 등이 있으며, 라이브러리 측면에서는 `
-
프로그래밍 언어 표준 -
ISO/IEC JTC 1/SC 22
ISO/IEC JTC 1/SC 22는 프로그래밍 언어, 환경 및 시스템 소프트웨어 인터페이스 분야의 표준화를 담당하는 ISO/IEC JTC 1의 하위 위원회이며, 다양한 프로그래밍 언어와 시스템 소프트웨어 인터페이스의 표준화를 목표로 1985년에 설립되었다. -
프로그래밍 언어 표준 -
C99
C99는 1999년 ISO/IEC 9899:1999로 출판된 C 프로그래밍 언어의 표준으로, 인라인 함수, 가변 길이 배열, `//` 주석 등 새로운 기능들을 추가하고 IEEE 부동소수점 자료 지원을 개선했으며 C90과 하위 호환성을 가지면서 C++와의 호환성을 고려했다. -
C++ -
헤더 파일
헤더 파일은 프로그래밍 언어에서 코드 재사용성, 모듈화, 컴파일 시간 단축에 기여하며 함수 프로토타입, 변수 선언 등을 포함하고 `#include` 지시어로 소스 코드에 포함되어 사용되는 파일이다. -
C++ -
소멸자 (컴퓨터 프로그래밍)
소멸자는 객체가 메모리에서 제거되기 직전에 호출되는 멤버 함수로, 객체 자원 해제 및 정리 작업을 수행하며, C++ 등 여러 언어에서 구현되고 메모리 누수 방지에 기여한다. -
프로그래밍 언어 -
다중 패러다임 프로그래밍 언어
다중 패러다임 프로그래밍 언어는 둘 이상의 프로그래밍 패러다임을 지원하며, 다양한 프로그래밍 스타일을 혼합하여 사용할 수 있도록 설계되었다. -
프로그래밍 언어 -
모조 (프로그래밍 언어)
모조는 모듈러사에서 개발한 파이썬과 유사한 구문의 고성능 프로그래밍 언어로, AI 애플리케이션 개발에 초점을 맞추고 러스트의 영향을 받은 메모리 안전성을 제공하며 향후 오픈 소스로 전환될 예정이다.
2. 역사
C++ 표준 위원회가 표준 출시 주기를 3년으로 고정하기 전까지 C++17의 출시일은 불명확했다. 그동안 C++17 개정판은 C++1z으로 불리기도 했는데, 이는 C++11이 C++0x나 C++1x로 불렸었고 C++14가 C++1y로 불렸던 것과 같은 이치이다. C++17의 사양은 2017년 3월에 Draft International Standard (DIS, 초안 국제 표준)까지 도달했다. 이 DIS는 약간의 수정 요구만을 동반한 채 만장일치로 승인되었으며, 최종 표준이 2017년 12월에 출시되었다. C++ 표준 템플릿 라이브러리에는 약간의 추가 사항만 있는데, `
3. 제거된 기능
트라이그래프가 제거되었다. std::auto_ptr, std::random_shuffle 및 이전 함수 어댑터를 포함하여 일부 더 이상 사용되지 않는 형식과 함수가 표준 라이브러리에서 제거되었다. 이는 C++11에서 std::unique_ptr, std::shuffle, std::bind 및 람다와 같은 개선된 기능으로 대체되었다. 스토리지 클래스 지정자로 키워드를 사용하는 것이 제거되었다. 이 키워드는 여전히 예약되어 있지만 현재는 사용되지 않는다.
4. 새로운 기능
C++17에는 다음과 같은 많은 새로운 기능이 도입되었다.
* `static_assert`의 진단 메시지를 생략할 수 있게 되었다.
* 템플릿의 템플릿 파라미터에 `class` 대신 `typename`을 사용할 수 있게 되었다.
* 초기화 목록으로부터의 타입 추론 (`auto`) 규칙이 신설되었다.
* 중첩된 네임스페이스 정의를 `namespace X::Y { … }`와 같이 쓸 수 있게 되었다.
* 네임스페이스나 열거형에 속성을 쓸 수 있게 되었다.
* 새로운 `fallthrough`, `maybe_unused`, `nodiscard` 속성이 표준에 추가되었다.
* UTF-8 (`u8`) 문자 리터럴을 사용할 수 있게 되었다.
* 16진 부동 소수점 리터럴을 사용할 수 있게 되었다.
* 모든 비타입 템플릿 인수를 상수 평가할 수 있게 되었다.
* 가변 길이 인수 템플릿에서의 축약식을 사용할 수 있게 되었다.
* `if constexpr(expression)` 형식의 컴파일 시점의 정적 `if` 문을 사용할 수 있게 되었다.
* 구조화된 바인딩 선언을 사용할 수 있게 되었다. (예: `auto [a, b] = getTwoReturnValues();`)
* `if` 문 및 `switch` 문에서 초기화자를 사용할 수 있게 되었다.
* `T`형(최상위 cv 한정자를 무시)의 순수 rvalue 식으로부터 `T`형 객체를 복사 초기화 및 직접 초기화할 때, 순수 rvalue 식으로부터 복사 생성자나 무브 생성자가 호출되지 않게 되었다. 자세한 내용은 복사 생략을 참조.
* over-aligned 한 메모리 할당에 관한 확장이 이루어졌다.
* 클래스 템플릿의 실인수 추론 (Class Template Argument Deduction: CTAD)이 가능해졌다. (예: `std::pair(5.0, false)` 와 같이 사용가능).
* 인라인 변수를 통해, 단일 정의 규칙에 반하지 않고 헤더 파일에서 변수를 정의할 수 있게 되었다. 효과는 인라인 함수와 동일하다.
* `__has_include`로 헤더가 이용 가능한지를 프리프로세서 지시어에서 확인할 수 있게 되었다.
* `__cplusplus`의 값은 `201703L`가 되었다.
* 예외 지정이 함수의 타입의 일부가 되었다.
* 다음과 같은 헤더가 추가되었다.
* `
* `
* `
* `
* `
4.1. 언어
- `static_assert`에서 텍스트 메시지를 선택적으로 제공할 수 있게 되었다.
- 템플릿 매개변수에서 `class` 대신 `typename`을 사용할 수 있다.
- braced-init-list의 `auto` 추론에 대한 새로운 규칙이 생겼다.
- 중첩된 네임스페이스를 정의할 때 `namespace X { namespace Y { … } }` 대신 `namespace X::Y { … }`와 같이 사용할 수 있다.
- 네임스페이스와 열거형에 attribute를 사용할 수 있다.
- 새로운 표준 attribute로 `fallthrough`, `maybe_unused`, `nodiscard`가 추가되었다.
- UTF-8 인코딩의 (u8) 문자 리터럴이 추가되었다. (UTF-8 문자열 리터럴은 C++11부터 있었으나, 문자 타입의 리터럴이 추가된 것이다. 그러나 1바이트에 한정되어 ASCII만 저장할 수 있다.)
- 16진수 부동소수점 리터럴을 사용할 수 있다.
- 모든 non-type 템플릿 인자에 대한 상수 평가가 이루어진다.
- 가변 템플릿을 위한 fold expressions을 사용할 수 있다.
- 컴파일 타임 정적 `if`문 ( `if constexpr(expression)` )이 추가되었다.
- 구조적 바인딩 선언 (`auto [a, b] = getTwoReturnValues();`)을 사용할 수 있다.
- `if`와 `switch`문에서 초기화를 할 수 있다.
- `T` 타입(최고 레벨의 cv-qualifier을 무시)의 prvalue 표현식을 이용한 `T` 타입의 복사 초기화 및 직접 초기화는 prvalue의 복사 생성자나 이동 생성자를 사용하지 않는다. 복사 생략 참고.
- over-aligned 메모리 할당에 대한 확장 기능이 추가되었다.
- 생성자의 템플릿 추론이 가능하다. (`std::pair
- 인라인 변수를 통해, One Definition Rule을 어기지 않고 헤더 파일에 변수 정의가 가능하다. 규칙은 인라인 함수와 같다.
- `__has_include`를 통해, 전처리기에 의해 헤더가 확인될 수 있게 해준다.
- 키워드 `register`는 이전에 사용 중지 권고되었으며, 이제 사용되지 않는다.
- `__cplusplus`의 값이 `201703L`로 변경되었다.
- 예외 사양이 함수 타입의 일부가 되었다.
- 람다 표현식이 값으로 "*this"를 캡처할 수 있게 되었다.
4.2. 라이브러리
* std::uncaught_exceptions영어가 추가되어 예외 처리에서 `std::uncaught_exception`를 대체함
* "연속적 반복기" 정의
* boost::filesystem영어 기반의 파일 시스템 라이브러리
* 병렬 버전의 STL 알고리즘
* Library Fundamentals TS I의 대부분 포함:
* std::string_view영어, 문자 시퀀스 또는 문자열 조각에 대한 읽기 전용 비 소유 참조
* std::optional영어, 선택적 객체를 표현하기 위한 것으로, 특정 알고리즘에서 항상 반환되지 않을 수 있는 데이터 타입이며, 비 반환 지원
* std::any영어, 모든 타입의 단일 값을 저장하기 위한 것
* std::map영어과 std::unordered_map영어 키-값 연관 데이터 구조를 위한 새로운 삽입 함수 try_emplace영어와 insert_or_assign영어
* 통일된 컨테이너 접근: std::size영어, std::empty영어 및 std::data영어
* 타원 적분 및 베셀 함수를 포함한 추가적인 수학적 특수 함수
* std::variant영어, 태그된 유니온 컨테이너
* std::byte영어, char를 바이트의 데이터를 문자 대신 바이트로 모델링하려는 데이터 타입에 대한 바이트로 대체 가능
* 논리 연산자 트레이트: std::conjunction영어, std::disjunction영어 및 std::negation영어
* 다형성 메모리 리소스를 위한 `
* 다음 헤더가 추가되었다.
* `
* `
* `
* `
* `
5. 컴파일러 지원
GCC 8은 완전하면서도 시험적으로 C++17을 지원한다. Clang 5 이상 버전은 모든 C++17 기능을 지원한다. Visual Studio 2017 15.7 (MSVC19.14)은 거의 전부를 지원하며, 15.8(MSVC 19.15) 이상 버전은 모든 C++17 언어 기능을 지원한다.
6. 라이브러리 지원
libstdc++는 버전 9.1부터 C++17에 대한 완전한 지원을 제공한다(병렬 처리 TS가 없고 C11 대신 C99를 참조하는 8.1). libc++는 버전 9부터 C++17에 대한 부분적인 지원을 제공하며, 나머지는 "진행 중"이다. Visual Studio 2017 15.8(MSVC 19.15) 표준 라이브러리 및 이후 버전은 "기본 문자열 변환"을 제외한 모든 C++17 라이브러리 기능을 지원하며 C11 대신 C99를 참조한다. "기본 문자열 변환"은 Visual Studio 2019 16.4에 추가되었다.