C ++ 17은 이제 완전한 기능이므로 큰 변화를 경험할 것 같지 않습니다. C ++ 17에 대한 수백 개의 제안이 제시되었습니다.
C ++ 17에서 C ++에 추가 된 기능은 무엇입니까?
“C ++ 1z”를 지원하는 C ++ 컴파일러를 사용할 때 컴파일러가 C ++ 17로 업데이트 할 때 어떤 기능을 사용할 수 있습니까?
답변
언어 특징 :
템플릿 및 일반 코드
-
- 함수가 템플릿 인수를 추론하는 방식과 마찬가지로 이제 생성자는 클래스의 템플릿 인수를 추론 할 수 있습니다.
- http://wg21.link/p0433r2 http://wg21.link/p0620r0 http://wg21.link/p0512r0
-
- 유형이 아닌 템플리트 인수 유형의 값을 나타냅니다.
람다
-
- 람다는 자격이 있다면 암묵적으로 constexpr입니다
-
[*this]{ std::cout << could << " be " << useful << '\n'; }
속성
-
컴파일러는 이제 인식하지 못하는 비표준 속성을 무시해야합니다 .
- C ++ 14 표현을 통해 컴파일러는 알 수없는 범위가 지정된 속성을 거부 할 수있었습니다.
구문 정리
-
- 인라인 함수처럼
- 컴파일러는 인스턴스가 인스턴스화되는 위치를 선택합니다
- 정적 constexpr redeclaration을 더 이상 사용하지 않으므로 이제는 암시 적으로 인라인됩니다.
-
static_assert(expression);
문자열이없는 단순 -
전혀
throw
하지 않는 한throw()
, 그리고throw()
이다noexcept(true)
.
보다 깨끗한 멀티 리턴 및 흐름 제어
-
- 기본적으로, 일류
std::tie
와auto
- 예:
const auto [it, inserted] = map.insert( {"foo", bar} );
- 변수 작성
it
및inserted
으로부터 유추 유형을pair
이map::insert
돌아갑니다.
- 튜플 / 페어
std::array
유사 및 비교적 평평한 구조체 와 함께 작동 - 표준에서 실제로 명명 된 구조적 바인딩
- 기본적으로, 일류
-
if (init; condition)
과switch (init; condition)
if (const auto [it, inserted] = map.insert( {"foo", bar} ); inserted)
- 눈에 띄게 변환 할 수없는
if(decl)
경우로 확장합니다decl
.
-
- 센티널 또는 시작 반복자와 같은 유형이 아닌 종료 반복자를 대부분 지원하는 것으로 보이며, 이는 널 종료 루프 등을 도와줍니다.
-
- 거의 일반적인 코드를 단순화하는 기능을 많이 요청했습니다.
기타
-
- 드디어!
- 모든 경우에 해당되는 것은 아니지만, “정품 제거”와 “제거”라고하는 “그냥 무언가를 만드는”구문을 구분합니다.
-
일부 수정 사항이있는 (일부) 표현식에 대한 고정 평가 순서
- 함수 인수를 포함하지 않지만 함수 인수 평가 인터리빙이 금지되었습니다.
- 깨진 코드를 대부분 작동시키고
.then
향후 작업을 수행합니다.
-
순방향 진행 보증 (FPG) ( 병렬 알고리즘을위한 FPG )
- 이것이 “구현이 스레드를 영원히 멈추지 않을 수 있습니다”라고 말하는 것 같아요?
-
u8'U', u8'T', u8'F', u8'8'
문자 리터럴 (문자열이 이미 존재 함) -
- 헤더 파일 포함에 오류가 있는지 테스트
- 실험에서 표준으로 거의 매끄럽게 마이그레이션
도서관 추가 :
자료형
-
- 거의 항상 비어 있지 않은 마지막 확인 했습니까?
- 태그 조합 유형
- {awesome | 유용한}
-
- 어쩌면 뭔가 중 하나를 보유하고
- 엄청나게 유용한
-
- 무엇이든 보관 가능 (복사 가능)
-
std::string
참조-문자 배열 또는 부분 문자열과 유사string const&
다시는 가져 가지 마십시오 . 또한 bajillion 시간을 더 빨리 구문 분석 할 수 있습니다."hello world"sv
- constexpr
char_traits
-
std::byte
그들이 씹을 수있는 것보다 더 많이- 정수도 문자도 데이터가 아닙니다
물건을 불러
std::invoke
- 하나의 구문으로 호출 가능 함수 (함수 포인터, 함수, 멤버 포인터)를 호출하십시오. 표준 INVOKE 개념에서.
std::apply
- 함수와 같은 튜플을 가져와 튜플을 호출로 압축 해제합니다.
-
std::make_from_tuple
,std::apply
객체 구성에 적용 -
is_invocable
,is_invocable_r
,invoke_result
- http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0077r2.html
- http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0604r0.html
- 더 이상 사용되지 않음
result_of
is_invocable<Foo(Args...), R>
“당신이 호출 할 수 있습니다Foo
와Args...
와와 호환 뭔가를 얻을R
“여기서R=void
기본값입니다.invoke_result<Foo, Args...>
이다std::result_of_t<Foo(Args...)>
하지만 분명히 덜 혼란?
파일 시스템 TS v1
새로운 알고리즘
-
for_each_n
-
reduce
-
transform_reduce
-
exclusive_scan
-
inclusive_scan
-
transform_exclusive_scan
-
transform_inclusive_scan
-
스레드 사용을 위해 추가되었으며 스레드를 사용하지 않더라도 노출됩니다.
스레딩
-
- 시간이 초과되어 필요하지 않은 경우 더 효율적일 수 있습니다.
-
atomic<T>
::is_always_lockfree
-
std::lock
한 번에 둘 이상의 뮤텍스를 잠글 때 약간의 고통을 덜어줍니다.
-
- 2014 년의 링크 된 용지가 오래되었을 수 있습니다.
- 병렬 버전의
std
알고리즘 및 관련 기계
라이브러리 기초 TS v1 위 또는 아래에 포함되지 않은 부분
[func.searchers]
과[alg.search]
- 검색 알고리즘 및 기술
-
- 할당 자처럼 다형성 할당
std::function
자 - 그리고 어떤 표준 메모리 자원이 함께 이동합니다 .
- http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0358r1.html
- 할당 자처럼 다형성 할당
-
std::sample
, 범위에서 샘플링?
컨테이너 개선
-
try_emplace
과insert_or_assign
- 가짜 이동 / 복사가 나쁜 경우에 더 나은 보증을 제공합니다
-
접합을위한
map<>
,unordered_map<>
,set<>
, 및unordered_set<>
- 컨테이너간에 노드를 저렴하게 이동하십시오.
- 전체 용기를 저렴하게 병합하십시오.
-
.data()
문자열이 아닌 상수 입니다. -
비회원
std::size
,std::empty
,std::data
std::begin
/ 처럼end
-
emplace
기능의 제품군은 이제 생성 된 객체에 대한 참조를 반환합니다 .
스마트 포인터 변경
unique_ptr<T[]>
수정 및 기타unique_ptr
조정.weak_from_this
그리고 일부는 이것에서 공유되도록 고정되었습니다.
다른 std
데이터 유형 개선 :
{}
건설std::tuple
및 기타 개선- TriviallyCopyable reference_wrapper 는 성능 향상이 가능합니다
기타
-
C ++ 17 라이브러리는 C99 대신 C11을 기반으로합니다.
-
향후 표준 라이브러리를
std[0-9]+
위해 예약 됨 -
- 대부분의
std
구현 에서 이미 노출 된 유틸리티 코드
- 대부분의
- 특수 수학 함수
- 과학자들은 그들을 좋아할지도 모른다
std::clamp()
std::clamp( a, b, c ) == std::max( b, std::min( a, c ) )
대충
gcd
과lcm
std::uncaught_exceptions
- 소멸자로부터 안전 할 경우에만 던지기를 원하는 경우 필수
std::as_const
std::bool_constant
_v
템플릿 변수 의 전체 무리std::void_t<T>
- 템플릿을 작성할 때 놀랍게도 유용
std::owner_less<void>
- 같은
std::less<void>
,하지만 내용에 따라 종류의 스마트 포인터에 대한
- 같은
std::chrono
광택std::conjunction
,std::disjunction
,std::negation
노출std::not_fn
- 내부 제외 규칙
std
- std :: is_contiguous_layout , 효율적인 해싱에 유용
- std :: to_chars / std :: from_chars , 고성능, 로케일 불가지론 적 숫자 변환; 마지막으로 사람이 읽을 수있는 형식으로 직렬화 / 직렬화하는 방법 (JSON & co)
std :: default_order , 간접 지정 오버(이름 맹 글링으로 인해 일부 컴파일러의 ABI가 중단되어 제거되었습니다.)std::less
.
특성
더 이상 사용되지 않음
- 일부 C 라이브러리 ,
<codecvt>
memory_order_consume
result_of
으로 교체invoke_result
shared_ptr::unique
스레드 안전하지 않습니다.
Isocpp.org는 C ++ 14 이후 독립적 인 변경 목록을 가지고 있습니다. 그것은 부분적으로 약탈되었습니다.
당연히 TS 작업은 병행하여 계속 진행되므로 다음 반복을 기다려야하는 불확실한 일부 TS가 있습니다. 다음 반복의 목표는 일부 소문이 암시하는 것처럼 C ++ 19가 아니라 이전에 계획된 C ++ 20입니다. C ++ 1O는 피했다.
이 reddit post 및 이 reddit post 에서 가져온 초기 목록 ( googling 또는 위의 isocpp.org 페이지에서 추가 된 링크 포함).
SD-6 기능 테스트 목록 에서 추가 항목이 제거되었습니다 .
clang의 기능 목록 및 라이브러리 기능 목록 은 다음에 약화됩니다. C ++ 17이 아니라 C ++ 1z이므로 신뢰할 수없는 것 같습니다.
이 슬라이드 에는 다른 기능이 누락되었습니다.
“제거 된 내용”은 묻지 않았지만 C ++ 17에서 C ++로 제거 된 몇 가지 (대부분 이전에 더 이상 사용되지 않음) 목록은 다음과 같습니다.
제거 :
register
, 향후 사용을 위해 예약 된 키워드bool b; ++b;
- 삼부작
- 여전히 필요한 경우 언어의 일부가 아닌 소스 파일 인코딩의 일부입니다.
- iOS 별명
- auto_ptr, 오래된
<functional>
것들,random_shuffle
- 할당 자
std::function
다시 말해서 이것이 코드에 영향을 주거나 표준에서 정리되었는지 확실하지 않습니다.
아직 위에 통합되지 않은 논문 :
-
P0505R0 (constexpr 크로노)
-
P0418R2 (원자 조정)
-
P0512R0 (템플릿 인수 공제 조정)
-
P0490R0 (구조적 바인딩 조정)
-
P0513R0 (로 변경
std::hash
) -
P0502R0 (병렬 예외)
-
P0509R1 (예외 처리에 대한 제한 사항 업데이트)
-
P0012R1 (예외 사양을 유형 시스템의 일부로 설정)
-
P0510R0 (변형에 대한 제한 사항)
-
P0504R0 (선택 / 변형 / 모든 태그)
-
P0497R0 (공유 ptr 조정)
-
P0508R0 (구조적 바인딩 노드 핸들)
-
P0521R0 (공유 포인터 사용 횟수 및 고유 한 변경?)
사양 변경 :
추가 참조 :
-
https://isocpp.org/files/papers/p0636r0.html
- 여기에서 “기존 기능 수정”으로 업데이트해야합니다.