C++17

C++17

C++17은 C++ 프로그래밍 언어용 ISO/IEC 14882 표준 버전입니다.C++17은 이전 버전의 C++ 표준인 C++14를 대체하고 나중에 C++20으로 대체되었습니다.

역사

C++ 표준 위원회가 3년의 출시 주기를 정하기 전에는 C++17의 출시 날짜가 불확실했습니다.이 기간 동안 C++17 리비전은 C++11의 경우 C++0x 또는 C++1x, C++14의 경우 C++1y에 이어 C++1z라고도 불렸습니다.C++17 규격은 2017년 [1][2]3월에 국제표준초안(DIS) 단계에 도달했다.이 DIS는 만장일치로 승인되었으며, 편집 [3]논평만 남겨 최종 표준은 2017년 [4]12월에 발표되었습니다.C++ 표준 템플릿 라이브러리는 거의 변경되지 않았지만, 헤더일부 알고리즘은 명시적 병렬화를 지원했고 구문적 개선도 이루어졌습니다.

제거된

이번 C++ 리비전에서는 새로운 기능이 추가되었을 뿐만 아니라 일부 기능이 삭제되었습니다.

  • 삼각자 [5][6]제거
  • 표준 라이브러리에서 사용되지 않는 일부 유형 및 기능 제거:std::auto_ptr,std::random_shuffle, 및 오래된 [7][8]기능 어댑터.C++11에서는 다음과 같은 개선된 설비로 대체되었습니다.std::unique_ptr,std::shuffle,std::bind, 그리고 람다.
  • 키워드의 (이전에는 사용되지 않았던) 사용 삭제register스토리지 클래스 [9]지정자로 사용합니다.이 키워드는 현재 예약되어 사용되지 않습니다.

신기능

C++17은 많은 신기능을 도입했습니다.다음 목록은 불완전할 수 있습니다.

언어

  • 텍스트 메시지 만들기static_assert옵션의[10]
  • 허락하다typename(의 대체 수단으로서class템플릿[11] 파라미터의 )를 지정합니다.
  • bracked-init-list에서[12][7] 차감하기 위한 새로운 규칙
  • 중첩된 네임스페이스 정의(예:namespace X::Y { }대신namespace X { namespace Y { } }[7][13]
  • 네임스페이스열거자[14][15] 대한 속성 허용
  • 새로운 표준 속성[[fallthrough]],[[maybe_unused]]그리고.[[nodiscard]][16]
  • UTF-8 (u8) 문자[14][17] 리터럴(UTF-8 문자열 리터럴은 C++11부터 존재해 왔습니다.C++17은 일관성을 위해 대응하는 문자 리터럴을 추가합니다.단, 1바이트로 제한되어 있기 때문에 저장할 수 있는 것은 "Basic Latin" 및 C0 제어 코드(ASCII )뿐입니다.
  • 16진 부동 소수점[18][19] 리터럴
  • 사용방법auto타입이 아닌[20] 템플릿파라미터의 타입으로서
  • 모든 비유형 템플릿[14][21] 인수에 대한 지속적인 평가
  • 표현식 접기, 가변 템플릿용[14][22]
  • 컴파일 타임 스태틱if형식과 함께if constexpr(expression)[23]
  • 구조화된 바인딩 선언, 허용auto [a, b] = getTwoReturnValues();[24]
  • 이니셜라이저if그리고.switch스테이트먼트[25]
  • 유형 객체의 복사 초기화 및 직접 초기화Tprvalue 형식의 표현으로부터T(최상위 cv-qualifier 포함)는 prvalue 식에서 생성자를 복사 또는 이동하지 않아야 합니다.상세한 것에 대하여는, 카피엘리젼을 참조해 주세요.
  • 오버 얼라인먼트된 메모리[26] 할당에 대한 일부 확장
  • Class Template Argument Deduation(CTAD; 클래스 템플릿 인수 공제) - 컨스트럭터 공제 가이드 도입(예: 허용).std::pair(5.0, false)명시적 생성자 인수 유형을 요구하는 대신std::pair<double, bool>(5.0, false)또는 추가 도우미 템플릿 기능std::make_pair(5.0, false)를 클릭합니다.[27][28]
  • 인라인 변수 - 하나의 정의 규칙을 위반하지 않고 헤더 파일의 변수를 정의할 수 있습니다.규칙은 인라인 함수와 실질적으로 동일합니다.
  • __has_include프리프로세서 디렉티브에[29] 의해 헤더의 가용성을 체크할 수 있습니다.
  • 가치__cplusplus로 변경되었다201703L[30]
  • 예외 사양이 함수[31] 유형에 포함되었습니다.
  • 람다 표현식은 값별로[32] "*this"를 캡처할 수 있습니다.

도서관

  • 다음을 [33][34]포함한 대부분의 라이브러리 기초 TS I:
    • std::string_view, 문자 시퀀스 또는 문자열[35] 대한 읽기 전용 비문자열 참조
    • std::optional옵션 오브젝트를 나타내는 경우, 논리턴을 지원하는 특정 알고리즘에 의해 항상 반환되지 않을 수 있는 데이터 타입입니다.
    • std::any모든 유형의 단일 값을 보유할 수 있습니다.
  • std::uncaught_exceptions대체품으로서std::uncaught_exception예외[36][14] 취급으로
  • 새로운 삽입 기능try_emplace그리고.insert_or_assign위해서std::map그리고.std::unordered_map 키-값 연관 데이터 구조[37][38]
  • 균일한 컨테이너 액세스:std::size,std::empty그리고.std::data[38][39]
  • '연속 반복기'[38][40]의 정의
  • 기반 파일 시스템 라이브러리boost::filesystem[41]
  • STL 알고리즘의[42] 병렬 버전
  • 타원 적분베셀[43] 함수를 포함한 추가 수학 특수 함수
  • std::variant, 태그 부착[44] 유니언 컨테이너
  • std::byte데이터 바이트를 문자[45] 아닌 바이트로 모델링하려는 데이터 유형에 대해 char를 대체할 수 있습니다.
  • 논리 연산자 특성:std::conjunction,std::disjunction그리고.std::negation[46]
  • <memory_resource>헤더, 다형 메모리자원용[47]

컴파일러 지원

  • GCC[48]버전8부터 C++17 언어 기능을 완전히 지원하고 있습니다.
  • Clang 5 이후에는 모든 C++17 언어 [49]기능을 지원합니다.
  • Visual Studio 2017 15.8(MSVC 19.15) 이후에는 모든 C++17 언어 [50][51]기능을 지원합니다.

라이브러리 지원

  • 버전 9.1 이후 libstdc++는 C++17을 완전히 지원합니다(8.1은 패럴렐리즘 TS를 사용하지 않고 C11이 아닌 C99를 참조).
  • 버전 9의 libc++는 C++17을 부분적으로 지원하며, 나머지는 "진행 중"입니다.
  • Visual Studio 2017 15.8 (MSVC 19.15) Standard Library 이후는 "Elementary String Conversions"를[54] 제외한 모든 C++17 라이브러리 기능을 지원하며 C11 대신 C99를 참조합니다. "Elementary String Conversions"는 Visual Studio 2019 16.4에 추가되었습니다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ "N4661 Editors' Report -- Programming Languages -- C++". 21 March 2017. Retrieved 2017-03-21.
  2. ^ "ISO/IEC DIS 14882: Programming Languages — C++" (PDF). Archived from the original (PDF) on 2017-03-25.
  3. ^ Herb Sutter (6 September 2017). "C++17 is formally approved".
  4. ^ "ISO/IEC 14882:2017".
  5. ^ "N3981: Removing trigraphs??! (Richard Smith)". 2014-05-06.
  6. ^ IBM은 C++17, IBM 문서 N4210, 2014-10-10에서 Trigraph-adverse 미래를 준비하는 것에 대해 언급하고 있습니다.작성자: Michael Wong, Hubert Tong, Rajan Bhakta, Derek Inglis
  7. ^ a b c "Updates to my trip report".
  8. ^ "N4190: Removing auto_ptr, random_shuffle(), And Old <functional> Stuff (Stephan T. Lavavej)".
  9. ^ "C++ Keywords: register".
  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. ^ "N4230: Nested namespace definition (Robert Kawulak, Andrew Tomazos)".
  14. ^ a b c d e "New core language papers adopted for C++17".
  15. ^ "N4266: Attributes for namespaces and enumerators (Richard Smith)".
  16. ^ "N4640: Working Draft, Standard for Programming Language C++" (PDF). pp. 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. ^ James Touton; Mike Spertus (2016-06-23). "Declaring non-type template parameters with auto".
  21. ^ "N4268: Allow constant evaluation for all non-type template arguments (Richard Smith)".
  22. ^ "N4295: Folding expressions (Andrew Sutton, Richard Smith)".
  23. ^ "N4659: Working Draft, Standard for Programming Language C++" (PDF). §9.4.1.
  24. ^ "N4659: Working Draft, Standard for Programming Language C++" (PDF). §11.5.
  25. ^ "Selection statements with initializer".
  26. ^ "Dynamic memory allocation for over-aligned data".
  27. ^ "Class template argument deduction".
  28. ^ "CppCon 2018: Timur Doumler "Class template argument deduction in C++17"". YouTube.
  29. ^ "N4640: Working Draft, Standard for Programming Language C++" (PDF). pp. 431–433.
  30. ^ "N4659: Working Draft, Standard for Programming Language C++" (PDF). §19.8.
  31. ^ "P0012R1: Make exception specifications be part of the type system, version 5".
  32. ^ "P0018R3: Lambda Capture of *this by Value as [=,*this], version 3".
  33. ^ "Adopt Library Fundamentals V1 TS Components for C++17 (R1)".
  34. ^ "Current Status".
  35. ^ "std::basic_string_view - cppreference.com". en.cppreference.com. Retrieved 2016-06-23.
  36. ^ "N4259: Wording for std::uncaught_exceptions (Herb Sutter)" (PDF).
  37. ^ "N4279: Improved insertion interface for unique-key maps (Thomas Köppe)".
  38. ^ a b c "New standard library papers adopted for C++17".
  39. ^ "N4280: Non-member size() and more (Riccardo Marcangelo)" (PDF).
  40. ^ "N4284: Contiguous Iterators (Jens Maurer)".
  41. ^ "Filesystem Library Proposal (Beman Dawes)".
  42. ^ "The Parallelism TS Should be Standardized".
  43. ^ "Mathematical Special Functions for C++17, v5" (PDF).
  44. ^ "N4659: Working Draft, Standard for Programming Language C++" (PDF). §23.7.
  45. ^ "A byte type definition" (PDF).
  46. ^ "N4659: Working Draft, Standard for Programming Language C++" (PDF). §23.15.8.
  47. ^ "PMR (Polymorphic Memory Resources) fully described -- Nico Josuttis".
  48. ^ "C++ Standards Support in GCC - GNU Project - Free Software Foundation (FSF)". gcc.gnu.org.
  49. ^ "Clang - C++17, C++14, C++11 and C++98 Status". clang.llvm.org.
  50. ^ corob-msft. "Visual C++ Language Conformance". docs.microsoft.com.
  51. ^ "Announcing: MSVC Conforms to the C++ Standard".
  52. ^ "Chapter 1. Status". gcc.gnu.org.
  53. ^ "libc++ C++17 Status". llvm.org.
  54. ^ "Announcing: MSVC Conforms to the C++ Standard". devblogs.microsoft.com.