{{위키데이터 속성 추적}}
{{C++ 언어 버전}}
2018년 기준으로 '''C++17'''은 [[C++]]의 [[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)까지 도달했다.<ref>{{웹 인용|url=http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4661.html|제목=N4661 Editors' Report -- Programming Languages -- C++|날짜=21 March 2017|확인날짜=2017-03-21}}</ref><ref>{{웹 인용|url=http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4660.pdf|제목=ISO/IEC DIS 14882: Programming Languages — C++|보존url=https://web.archive.org/web/20170325025026/http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4660.pdf|보존날짜=2017-03-25|url-status=dead}}</ref> 이 DIS는 약간의 수정 요구만을 동반한 채 만장일치로 승인되었으며,<ref>{{웹 인용|url=https://herbsutter.com/2017/09/06/c17-is-formally-approved/|제목=C++17 is formally approved|성=[[Herb Sutter]]}}</ref> 최종 표준이 2017년 12월에 출시되었다.<ref>{{웹 인용|url=https://www.iso.org/standard/68564.html|제목=ISO/IEC 14882:2017}}</ref> C++ [[표준 템플릿 라이브러리]]에는 약간의 추가 사항만 있다. <algorithm> 헤더의 몇몇 알고리즘들에 명시적 병렬화 기능이 생겼으며, 문법의 개선이 이루어졌다.

=== 다음 표준 ===

* [[C++20]]<ref>https://herbsutter.com/2016/06/30/trip-report-summer-iso-c-standards-meeting-oulu/ "the next standard after C++17 will be C++20"</ref><ref>{{웹 인용|url=https://isocpp.org/std/status|제목=Current Status : Standard C++}}</ref><ref>{{웹 인용|url=https://botondballo.wordpress.com/2017/08/02/trip-report-c-standards-meeting-in-toronto-july-2017/|제목=Trip Report: C++ Standards Meeting in Toronto, July 2017|날짜=2 August 2017|확인날짜=11 January 2018}}</ref>

== 제거된 기능 ==
이번 C++ 개정판에는 몇몇 기능이 제거되기도 하였다.

* [[삼중자]] 제거<ref>[http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4210.pdf 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</ref>
* <code>std::auto_ptr</code>, <code>std::random_shuffle</code>, 오래된 함수 어댑터 와 같이 사용 중단된 표준 라이브러리의 타입과 함수의 제거<ref>{{웹 인용|url=http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4190.htm|제목=N4190: Removing auto_ptr, random_shuffle(), And Old &lt;functional&gt; Stuff (Stephan T. Lavavej)}}</ref>

== 새로운 기능 ==
C++17는 많은 새 기능을 선보인다. 다음 목록은 완전하지 않을 수 있다.

=== 언어 ===

* <code>static_assert</code>에서 텍스트 메시지를 선택적으로 제공<ref>{{웹 인용|url=http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3928.pdf|제목=N3928: Extending static_assert, v2 (Walter E. Brown)}}</ref>

* 템플릿 매개변수에서 <code>typename</code>을 <code>class</code> 대신 사용가능<ref>{{웹 인용|url=http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4051.html|제목=N4051: Allow typename in a template template parameter (Richard Smith)}}</ref>

* braced-init-list의 <code>auto</code> 추론에 대한 새로운 규칙<ref>{{웹 인용|url=http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3922.html|제목=N3922: New Rules for auto deduction from braced-init-list (James Dennett)}}</ref><ref name="isocpp-update">{{웹 인용|url=http://isocpp.org/blog/2014/11/updates-to-my-trip-report|제목=Updates to my trip report}}</ref>

* 중첩된 네임스페이스의 정의. <code>namespace X { namespace Y { … } }</code> 대신 <code>namespace X::Y { … }</code> 사용 가능<ref>{{웹 인용|url=http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4230.html|제목=N4230: Nested namespace definition (Robert Kawulak, Andrew Tomazos)}}</ref>

* [[이름공간|네임스페이스]]와 [[열거형|열거형]]에 attribute 사용 가능<ref>{{웹 인용|url=http://isocpp.org/files/papers/n4266.html|제목=N4266: Attributes for namespaces and enumerators (Richard Smith)}}</ref>

* 새로운 표준 attribute <code><nowiki>[[</nowiki>fallthrough<nowiki>]]</nowiki></code>, <code><nowiki>[[</nowiki>maybe_unused<nowiki>]]</nowiki></code>, <code><nowiki>[[</nowiki>nodiscard<nowiki>]]</nowiki></code><ref>{{웹 인용|url=http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4640.pdf|제목=N4640: Working Draft, Standard for Programming Language C++|쪽=193–195}}</ref>

* [[UTF-8|UTF-8]] 인코딩의 (<code>u8</code>) 문자 리터럴<ref>{{웹 인용|url=http://isocpp.org/files/papers/n4267.html|제목=N4267: Adding u8 character literals (Richard Smith)}}</ref> (UTF-8 문자열 리터럴은 [[C++11]]부터 있었으나, 문자 타입의 리터럴이 추가된 것임. 그러나 1바이트에 한정되어 [[ASCII]]만 저장할 수 있음.)

* 16진수 [[부동소수점]] 리터럴<ref>{{웹 인용|url=http://wg21.link/p0245r1|제목=Hexadecimal floating literals for C++|성=Thomas Köppe}}</ref><ref>{{웹 인용|url=http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4659.pdf|제목=N4659: Working Draft, Standard for Programming Language C++|쪽기타=§5.13.4}}</ref>

* 모든 non-type 템플릿 인자에 대한 상수 평가<ref>{{웹 인용|url=http://isocpp.org/files/papers/n4268.html|제목=N4268: Allow constant evaluation for all non-type template arguments (Richard Smith)}}</ref>

* 가변 템플릿을 위한 fold expressions<ref>{{웹 인용|url=http://isocpp.org/files/papers/n4295.html|제목=N4295: Folding expressions (Andrew Sutton, Richard Smith)}}</ref>

* 컴파일 타임 정적 <code>if</code>문 추가됨: <code>if constexpr(expression)</code><ref>{{웹 인용|url=http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4659.pdf|제목=N4659: Working Draft, Standard for Programming Language C++|쪽기타=§9.4.1}}</ref>

* 구조적 바인딩 선언. <code>auto [a, b] = getTwoReturnValues();</code><ref>{{웹 인용|url=http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4659.pdf|제목=N4659: Working Draft, Standard for Programming Language C++|쪽기타=§11.5}}</ref>

* <code>if</code>와 <code>switch</code>문에서의 초기화<ref>{{웹 인용|url=http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0305r0.html|제목=If statement with initializer}}</ref>

* <code>T</code> 타입(최고 레벨의 cv-qualifier을 무시한 채)의 prvalue 포현식을 이용한 <code>T</code> 타입의 복사 초기화 및 직접 초기화는 prvalue의 복사 생성자나 이동 생성자를 사용하지 않음. copy elision 참고</font>

* over-aligned 메모리 할당에 대한 확장 기능<ref>{{웹 인용|url=http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0035r4.html|제목=Dynamic memory allocation for over-aligned data}}</ref>

* [[생성자]]의 템플릿 추론. <code>std::pair<double, bool><double, bool="">(5.0, false)</double,></code> 대신에 <code>std::pair(5.0, false)</code> 사용 가능

* 인라인 변수. One Definition Rule을 어기지 않고 헤더 파일에 변수 정의 가능. 규칙은 [[인라인 함수]]와 같음.

* <code>__has_include</code>, 전처리기에 의해 헤더가 확인될 수 있게 해줌.<ref>{{웹 인용|url=http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4640.pdf|제목=N4640: Working Draft, Standard for Programming Language C++|쪽=431–433}}</ref>

* 키워드 <code>register</code>는 이전에 사용 중지 권고되었으며, 이제 사용되지 않음.<ref>{{웹 인용|url=https://en.cppreference.com/w/cpp/keyword/register|제목=C++ Keywords: register}}</ref>

* <code>__cplusplus</code>의 값이 <code>201703L</code>로 변경됨<ref>{{웹 인용|url=http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4659.pdf|제목=N4659: Working Draft, Standard for Programming Language C++|쪽기타=§19.8}}</ref>

=== 라이브러리 ===

* <code>std::uncaught_exceptions</code>가 추가되어 [[예외 처리]]에서 <code>std::uncaught_exception</code>를 대체함<ref>{{웹 인용|url=http://isocpp.org/files/papers/n4259.pdf|제목=N4259: Wording for std::uncaught_exceptions (Herb Sutter)}}</ref><ref name="isocpp-core">{{웹 인용|url=https://isocpp.org/blog/2014/11/new-papers-adopted-for-cpp17|제목=New core language papers adopted for C++17}}</ref>

* 의 정의"연속적 [[반복자|반복기를]]"<ref>{{웹 인용|url=https://isocpp.org/files/papers/n4284.html|제목=N4284: Contiguous Iterators (Jens Maurer)}}</ref>

* <code>boost::filesystem</code> 기반의 [[파일 시스템]] 라이브러리<ref>{{웹 인용|url=http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3505.html|제목=Filesystem Library Proposal (Beman Dawes)}}</ref>

* [[병렬 컴퓨팅|병렬]] 버전의 [[표준 템플릿 라이브러리|STL]] 알고리즘<ref>{{웹 인용|url=https://isocpp.org/files/papers/P0024R2.html|제목=The Parallelism TS Should be Standardized}}</ref>

== 컴파일러 지원 ==

* GCC 8은 완전하면서도 시험적으로 지원함<ref>{{웹 인용|url=https://gcc.gnu.org/projects/cxx-status.html|제목=C++ Standards Support in GCC - GNU Project - Free Software Foundation (FSF)|웹사이트=gcc.gnu.org}}</ref><ref>{{웹 인용|url=https://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html|제목=Chapter 1. Status|웹사이트=gcc.gnu.org}}</ref>
* Clang 5 이상의 버전은 모든 기능을 지원함<ref>{{웹 인용|url=https://clang.llvm.org/cxx_status.html|제목=Clang - C++17, C++14, C++11 and C++98 Status|웹사이트=clang.llvm.org}}</ref>
* Visual Studio 2017 15.7 (MSVC19.14)은 거의 전부를 지원함<ref>{{웹 인용|url=https://docs.microsoft.com/en-us/cpp/visual-cpp-language-conformance|제목=Visual C++ Language Conformance|성=corob-msft|웹사이트=docs.microsoft.com}}</ref><ref>{{웹 인용|url=https://blogs.msdn.microsoft.com/vcblog/2018/05/07/announcing-msvc-conforms-to-the-c-standard/|제목=Announcing: MSVC Conforms to the C++ Standard}}</ref>{{Clarify|reason=How is it complete but experimental?|date=October 2018}}

== 같이 보기 ==
* [[C11 (C 버전)]]
== 참조 ==

* [[C++|C++98]]
* C++03
* C++20
* C++ 컴파일러
* [[C11 (C 버전)]]
* C18 (C 버전)

== 각주 ==
{{각주}}

{{C++}}
[[분류:C++]]
[[분류:프로그래밍 언어 표준]]
[[분류:프로그래밍 언어]]