C++17

위키백과, 우리 모두의 백과사전.

2018년 기준으로 C++17C++의 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)까지 도달했다.[1][2] 이 DIS는 약간의 수정 요구만을 동반한 채 만장일치로 승인되었으며,[3] 최종 표준이 2017년 12월에 출시되었다.[4] C++ 표준 템플릿 라이브러리에는 약간의 추가 사항만 있다. <algorithm> 헤더의 몇몇 알고리즘들에 명시적 병렬화 기능이 생겼으며, 문법의 개선이 이루어졌다.

다음 표준[편집]

제거된 기능[편집]

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

  • 삼중자 제거[8]
  • std::auto_ptr, std::random_shuffle, 오래된 함수 어댑터 와 같이 사용 중단된 표준 라이브러리의 타입과 함수의 제거[9]

새로운 기능[편집]

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

언어[편집]

  • static_assert에서 텍스트 메시지를 선택적으로 제공[10]
  • 템플릿 매개변수에서 typenameclass 대신 사용가능[11]
  • braced-init-list의 auto 추론에 대한 새로운 규칙[12][13]
  • 중첩된 네임스페이스의 정의. namespace X { namespace Y { … } } 대신 namespace X::Y { … } 사용 가능[14]
  • 새로운 표준 attribute [[fallthrough]], [[maybe_unused]][[nodiscard]][16]
  • UTF-8 인코딩의 (u8) 문자 리터럴[17] (UTF-8 문자열 리터럴은 C++11부터 있었으나, 문자 타입의 리터럴이 추가된 것임. 그러나 1바이트에 한정되어 ASCII만 저장할 수 있음.)
  • 모든 non-type 템플릿 인자에 대한 상수 평가[20]
  • 가변 템플릿을 위한 fold expressions[21]
  • 컴파일 타임 정적 if문 추가됨: if constexpr(expression)[22]
  • 구조적 바인딩 선언. auto [a, b] = getTwoReturnValues();[23]
  • ifswitch문에서의 초기화[24]
  • T 타입(최고 레벨의 cv-qualifier을 무시한 채)의 prvalue 포현식을 이용한 T 타입의 복사 초기화 및 직접 초기화는 prvalue의 복사 생성자나 이동 생성자를 사용하지 않음. copy elision 참고
  • over-aligned 메모리 할당에 대한 확장 기능[25]
  • 생성자의 템플릿 추론. std::pair<double, bool><double, bool="">(5.0, false)</double,> 대신에 std::pair(5.0, false) 사용 가능
  • 인라인 변수. One Definition Rule을 어기지 않고 헤더 파일에 변수 정의 가능. 규칙은 인라인 함수와 같음.
  • __has_include, 전처리기에 의해 헤더가 확인될 수 있게 해줌.[26]
  • 키워드 register는 이전에 사용 중지 권고되었으며, 이제 사용되지 않음.[27]
  • __cplusplus의 값이 201703L로 변경됨[28]

라이브러리[편집]

  • std::uncaught_exceptions가 추가되어 예외 처리에서 std::uncaught_exception를 대체함[29][30]

컴파일러 지원[편집]

  • GCC 8은 완전하면서도 시험적으로 지원함[34][35]
  • Clang 5 이상의 버전은 모든 기능을 지원함[36]
  • Visual Studio 2017 15.7 (MSVC19.14)은 거의 전부를 지원함[37][38][모호한 표현]

참조[편집]

각주[편집]

  1. “N4661 Editors' Report -- Programming Languages -- C++”. 2017년 3월 21일. 2017년 3월 21일에 확인함. 
  2. “ISO/IEC DIS 14882: Programming Languages — C++” (PDF). 2017년 3월 25일에 원본 문서 (PDF)에서 보존된 문서. 
  3. Herb Sutter. “C++17 is formally approved”. 
  4. “ISO/IEC 14882:2017”. 
  5. https://herbsutter.com/2016/06/30/trip-report-summer-iso-c-standards-meeting-oulu/ "the next standard after C++17 will be C++20"
  6. “Current Status : Standard C++”. 
  7. “Trip Report: C++ Standards Meeting in Toronto, July 2017”. 2017년 8월 2일. 2018년 1월 11일에 확인함. 
  8. 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
  9. “N4190: Removing auto_ptr, random_shuffle(), And Old <functional> Stuff (Stephan T. Lavavej)”. 
  10. “N3928: Extending static_assert, v2 (Walter E. Brown)” (PDF). 
  11. “N4051: Allow typename in a template template parameter (Richard Smith)”. 
  12. “N3922: New Rules for auto deduction from braced-init-list (James Dennett)”. 
  13. “Updates to my trip report”. 
  14. “N4230: Nested namespace definition (Robert Kawulak, Andrew Tomazos)”. 
  15. “N4266: Attributes for namespaces and enumerators (Richard Smith)”. 
  16. “N4640: Working Draft, Standard for Programming Language C++” (PDF). 193–195쪽. 
  17. “N4267: Adding u8 character literals (Richard Smith)”. 
  18. Thomas Köppe. “Hexadecimal floating literals for C++”. 
  19. “N4659: Working Draft, Standard for Programming Language C++” (PDF). §5.13.4. 
  20. “N4268: Allow constant evaluation for all non-type template arguments (Richard Smith)”. 
  21. “N4295: Folding expressions (Andrew Sutton, Richard Smith)”. 
  22. “N4659: Working Draft, Standard for Programming Language C++” (PDF). §9.4.1. 
  23. “N4659: Working Draft, Standard for Programming Language C++” (PDF). §11.5. 
  24. “If statement with initializer”. 
  25. “Dynamic memory allocation for over-aligned data”. 
  26. “N4640: Working Draft, Standard for Programming Language C++” (PDF). 431–433쪽. 
  27. “C++ Keywords: register”. 
  28. “N4659: Working Draft, Standard for Programming Language C++” (PDF). §19.8. 
  29. “N4259: Wording for std::uncaught_exceptions (Herb Sutter)” (PDF). 
  30. “New core language papers adopted for C++17”. 
  31. “N4284: Contiguous Iterators (Jens Maurer)”. 
  32. “Filesystem Library Proposal (Beman Dawes)”. 
  33. “The Parallelism TS Should be Standardized”. 
  34. “C++ Standards Support in GCC - GNU Project - Free Software Foundation (FSF)”. 《gcc.gnu.org》. 
  35. “Chapter 1. Status”. 《gcc.gnu.org》. 
  36. “Clang - C++17, C++14, C++11 and C++98 Status”. 《clang.llvm.org》. 
  37. corob-msft. “Visual C++ Language Conformance”. 《docs.microsoft.com》. 
  38. “Announcing: MSVC Conforms to the C++ Standard”.