C++17

C++ 언어 버전 2018년 기준으로 **C++17**은 C++의 ISO/IEC 14882 표준 중 가장 최신 개정판이다.
# 역사
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)까지 도달했다.확인날짜=2017-03-21url-status=dead 이 DIS는 약간의 수정 요구만을 동반한 채 만장일치로 승인되었으며,성=Herb Sutter 최종 표준이 2017년 12월에 출시되었다.제목=ISO/IEC 14882:2017 C++ 표준 템플릿 라이브러리에는 약간의 추가 사항만 있다. 헤더의 몇몇 알고리즘들에 명시적 병렬화 기능이 생겼으며, 문법의 개선이 이루어졌다.
## 다음 표준
* C++20https://herbsutter.com/2016/06/30/trip-report-summer-iso-c-standards-meeting-oulu/ "the next standard after C++17 will be C++20"제목=Current Status : Standard C++확인날짜=11 January 2018
# 제거된 기능
이번 C++ 개정판에는 몇몇 기능이 제거되기도 하였다. * 삼중자 제거IBM comment on preparing for a Trigraph-adverse future in C++17, IBM paper N4210, 2014-10-10. Authors: Michael Wong, Hubert Tong, Rajan Bhakta, Derek Inglis * `std::auto_ptr`, `std::random_shuffle`, 오래된 함수 어댑터 와 같이 사용 중단된 표준 라이브러리의 타입과 함수의 제거제목=N4190: Removing auto_ptr, random_shuffle(), And Old Stuff (Stephan T. Lavavej)
# 새로운 기능
C++17는 많은 새 기능을 선보인다. 다음 목록은 완전하지 않을 수 있다.
## 언어
* `static_assert`에서 텍스트 메시지를 선택적으로 제공제목=N3928: Extending static_assert, v2 (Walter E. Brown) * 템플릿 매개변수에서 `typename`을 `class` 대신 사용가능제목=N4051: Allow typename in a template template parameter (Richard Smith) * braced-init-list의 `auto` 추론에 대한 새로운 규칙제목=N3922: New Rules for auto deduction from braced-init-list (James Dennett)제목=Updates to my trip report * 중첩된 네임스페이스의 정의. `namespace X { namespace Y { … } }` 대신 `namespace X::Y { … }` 사용 가능제목=N4230: Nested namespace definition (Robert Kawulak, Andrew Tomazos) * 네임스페이스와 열거형에 attribute 사용 가능제목=N4266: Attributes for namespaces and enumerators (Richard Smith) * 새로운 표준 attribute `fallthrough`, `maybe_unused`, `nodiscard`쪽=193–195 * UTF-8 인코딩의 (`u8`) 문자 리터럴제목=N4267: Adding u8 character literals (Richard Smith) (UTF-8 문자열 리터럴은 C++11부터 있었으나, 문자 타입의 리터럴이 추가된 것임. 그러나 1바이트에 한정되어 ASCII만 저장할 수 있음.) * 16진수 부동소수점 리터럴성=Thomas Köppe쪽기타=§5.13.4 * 모든 non-type 템플릿 인자에 대한 상수 평가제목=N4268: Allow constant evaluation for all non-type template arguments (Richard Smith) * 가변 템플릿을 위한 fold expressions제목=N4295: Folding expressions (Andrew Sutton, Richard Smith) * 컴파일 타임 정적 `if`문 추가됨: `if constexpr(expression)`쪽기타=§9.4.1 * 구조적 바인딩 선언. `auto [a, b] = getTwoReturnValues();`쪽기타=§11.5 * `if`와 `switch`문에서의 초기화제목=If statement with initializer * `T` 타입(최고 레벨의 cv-qualifier을 무시한 채)의 prvalue 포현식을 이용한 `T` 타입의 복사 초기화 및 직접 초기화는 prvalue의 복사 생성자나 이동 생성자를 사용하지 않음. copy elision 참고 * over-aligned 메모리 할당에 대한 확장 기능제목=Dynamic memory allocation for over-aligned data * 생성자의 템플릿 추론. `std::pair(5.0, false)` 대신에 `std::pair(5.0, false)` 사용 가능 * 인라인 변수. One Definition Rule을 어기지 않고 헤더 파일에 변수 정의 가능. 규칙은 인라인 함수와 같음. * `__has_include`, 전처리기에 의해 헤더가 확인될 수 있게 해줌.쪽=431–433 * 키워드 `register`는 이전에 사용 중지 권고되었으며, 이제 사용되지 않음.제목=C++ Keywords: register * `__cplusplus`의 값이 `201703L`로 변경됨쪽기타=§19.8
## 라이브러리
* `std::uncaught_exceptions`가 추가되어 예외 처리에서 `std::uncaught_exception`를 대체함제목=N4259: Wording for std::uncaught_exceptions (Herb Sutter)제목=New core language papers adopted for C++17 * 의 정의"연속적 반복기를"제목=N4284: Contiguous Iterators (Jens Maurer) * `boost::filesystem` 기반의 파일 시스템 라이브러리제목=Filesystem Library Proposal (Beman Dawes) * 병렬 버전의 STL 알고리즘제목=The Parallelism TS Should be Standardized
# 컴파일러 지원
* GCC 8은 완전하면서도 시험적으로 지원함웹사이트=gcc.gnu.org웹사이트=gcc.gnu.org * Clang 5 이상의 버전은 모든 기능을 지원함웹사이트=clang.llvm.org * Visual Studio 2017 15.7 (MSVC19.14)은 거의 전부를 지원함웹사이트=docs.microsoft.com제목=Announcing: MSVC Conforms to the C++ Standard
# 참조
* C++98 * C++03 * C++20 * C++ 컴파일러 * C11 (C 버전) * C18 (C 버전)