C++17
C++17C++ 언어 리비전 |
---|
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] - 유형 객체의 복사 초기화 및 직접 초기화
T
prvalue 형식의 표현으로부터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::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에 추가되었습니다.
「 」를 참조해 주세요.
레퍼런스
- ^ "N4661 Editors' Report -- Programming Languages -- C++". 21 March 2017. Retrieved 2017-03-21.
- ^ "ISO/IEC DIS 14882: Programming Languages — C++" (PDF). Archived from the original (PDF) on 2017-03-25.
- ^ Herb Sutter (6 September 2017). "C++17 is formally approved".
- ^ "ISO/IEC 14882:2017".
- ^ "N3981: Removing trigraphs??! (Richard Smith)". 2014-05-06.
- ^ IBM은 C++17, IBM 문서 N4210, 2014-10-10에서 Trigraph-adverse 미래를 준비하는 것에 대해 언급하고 있습니다.작성자: Michael Wong, Hubert Tong, Rajan Bhakta, Derek Inglis
- ^ a b c "Updates to my trip report".
- ^ "N4190: Removing auto_ptr, random_shuffle(), And Old <functional> Stuff (Stephan T. Lavavej)".
- ^ "C++ Keywords: register".
- ^ "N3928: Extending static_assert, v2 (Walter E. Brown)" (PDF).
- ^ "N4051: Allow typename in a template template parameter (Richard Smith)".
- ^ "N3922: New Rules for auto deduction from braced-init-list (James Dennett)".
- ^ "N4230: Nested namespace definition (Robert Kawulak, Andrew Tomazos)".
- ^ a b c d e "New core language papers adopted for C++17".
- ^ "N4266: Attributes for namespaces and enumerators (Richard Smith)".
- ^ "N4640: Working Draft, Standard for Programming Language C++" (PDF). pp. 193–195.
- ^ "N4267: Adding u8 character literals (Richard Smith)".
- ^ Thomas Köppe. "Hexadecimal floating literals for C++".
- ^ "N4659: Working Draft, Standard for Programming Language C++" (PDF). §5.13.4.
- ^ James Touton; Mike Spertus (2016-06-23). "Declaring non-type template parameters with auto".
- ^ "N4268: Allow constant evaluation for all non-type template arguments (Richard Smith)".
- ^ "N4295: Folding expressions (Andrew Sutton, Richard Smith)".
- ^ "N4659: Working Draft, Standard for Programming Language C++" (PDF). §9.4.1.
- ^ "N4659: Working Draft, Standard for Programming Language C++" (PDF). §11.5.
- ^ "Selection statements with initializer".
- ^ "Dynamic memory allocation for over-aligned data".
- ^ "Class template argument deduction".
- ^ "CppCon 2018: Timur Doumler "Class template argument deduction in C++17"". YouTube.
- ^ "N4640: Working Draft, Standard for Programming Language C++" (PDF). pp. 431–433.
- ^ "N4659: Working Draft, Standard for Programming Language C++" (PDF). §19.8.
- ^ "P0012R1: Make exception specifications be part of the type system, version 5".
- ^ "P0018R3: Lambda Capture of *this by Value as [=,*this], version 3".
- ^ "Adopt Library Fundamentals V1 TS Components for C++17 (R1)".
- ^ "Current Status".
- ^ "std::basic_string_view - cppreference.com". en.cppreference.com. Retrieved 2016-06-23.
- ^ "N4259: Wording for std::uncaught_exceptions (Herb Sutter)" (PDF).
- ^ "N4279: Improved insertion interface for unique-key maps (Thomas Köppe)".
- ^ a b c "New standard library papers adopted for C++17".
- ^ "N4280: Non-member size() and more (Riccardo Marcangelo)" (PDF).
- ^ "N4284: Contiguous Iterators (Jens Maurer)".
- ^ "Filesystem Library Proposal (Beman Dawes)".
- ^ "The Parallelism TS Should be Standardized".
- ^ "Mathematical Special Functions for C++17, v5" (PDF).
- ^ "N4659: Working Draft, Standard for Programming Language C++" (PDF). §23.7.
- ^ "A byte type definition" (PDF).
- ^ "N4659: Working Draft, Standard for Programming Language C++" (PDF). §23.15.8.
- ^ "PMR (Polymorphic Memory Resources) fully described -- Nico Josuttis".
- ^ "C++ Standards Support in GCC - GNU Project - Free Software Foundation (FSF)". gcc.gnu.org.
- ^ "Clang - C++17, C++14, C++11 and C++98 Status". clang.llvm.org.
- ^ corob-msft. "Visual C++ Language Conformance". docs.microsoft.com.
- ^ "Announcing: MSVC Conforms to the C++ Standard".
- ^ "Chapter 1. Status". gcc.gnu.org.
- ^ "libc++ C++17 Status". llvm.org.
- ^ "Announcing: MSVC Conforms to the C++ Standard". devblogs.microsoft.com.