질문 : C ++ 17의 새로운 기능은 무엇입니까?
C ++ 17은 이제 기능이 완전하므로 큰 변화가 없을 것입니다. C ++ 17에 대한 수백 개의 제안이 제출되었습니다.
C ++ 17에서 C ++에 추가 된 기능은 무엇입니까?
"C ++ 1z"를 지원하는 C ++ 컴파일러를 사용할 때 컴파일러가 C ++ 17로 업데이트 할 때 사용할 수있는 기능은 무엇입니까?
답변
언어 기능:
템플릿 및 일반 코드:
- 클래스 템플릿에 대한 템플릿 인수 추론
- 함수가 템플릿 인수를 추론하는 방식과 마찬가지로 이제 생성자는 클래스의 템플릿 인수를 추론 할 수 있습니다.
- http://wg21.link/p0433r2 http://wg21.link/p0620r0 http://wg21.link/p0512r0
template <auto>
- 모든 (유형이 아닌 템플릿 인수) 유형의 값을 나타냅니다.
- 유형이 아닌 템플릿 인수 수정
template<template<class...>typename bob> struct foo {}
- (접기 + ... + 표현식) 및 수정
auto x{8};
int
- with
...
및 목록을using
현대화
람다:
- constexpr 람다
- Lambda는 자격이있는 경우 암시 적으로 constexpr입니다.
*this
를 람다로 캡처[*this]{ std::cout << could << " be " << useful << '\n'; }
속성:
[[fallthrough]]
,[[nodiscard]]
,[[maybe_unused]]
속성namespace
및enum { erator[[s]] }
[[attributes]]
- 속성 네임 스페이스를 반복하지 않으려면 in 속성
using
- 이제 컴파일러는 인식하지 못하는 비표준 속성을 무시해야합니다 .
- C ++ 14 문구는 컴파일러가 알 수없는 범위 속성을 거부하도록 허용했습니다.
구문 정리:
- 인라인 변수
- 인라인 함수처럼
- 컴파일러는 인스턴스가 인스턴스화되는 위치를 선택합니다.
- 이제 암시 적으로 인라인 된 정적 constexpr redeclaration을 사용하지 않습니다.
namespace A::B
- 단순
static_assert(expression);
문자열없이 - 더
throw
하지 않는throw()
, 및throw()
이다noexcept(true)
.
Cleaner multi-return 및 flow control
- 구조화 된 바인딩
- 기본적으로 일류
std::tie
withauto
- 예:
const auto [it, inserted] = map.insert( {"foo", bar} );
- 변수 작성
it
및inserted
으로부터 유추 유형pair
그map::insert
돌아갑니다.
- tuple / pair-likes 및
std::array
및 비교적 평평한 구조체와 함께 작동합니다. - 표준에서 실제로 명명 된 구조화 된 바인딩
- 기본적으로 일류
if (init; condition)
및switch (init; condition)
if (const auto [it, inserted] = map.insert( {"foo", bar} ); inserted)
if(decl)
decl
이 현명하게 bool로 변환 할 수없는 경우로 확장합니다.
- 범위 기반 for 루프 일반화
- 대부분 센티널 또는 시작 반복기와 동일한 유형이 아닌 종료 반복기를 지원하는 것으로 보이며, 이는 널 종료 루프 등에 도움이됩니다.
- constexpr 인 경우
- 거의 일반적인 코드를 단순화하기 위해 많이 요청 된 기능입니다.
Misc
- 16 진수 부동 소수점 리터럴
- 과도하게 정렬 된 데이터에 대한 동적 메모리 할당
- 보장 된 복사 제거
- 드디어!
- 모든 경우에 해당되는 것은 아니지만 "진짜 제거"와 "제거"라고하는 "무언가 생성"하는 구문을 구분합니다.
- (일부) 표현식에 대한 평가 순서를 수정하여 수정했습니다.
- 함수 인수를 포함하지 않지만 함수 인수 평가 인터리빙이 이제 금지됨
- 대부분의 깨진 코드가 작동하도록 만들고 향후 작업에서
.then
- 열거 형의 직접 목록 초기화
- 전방 진행 보장 (FPG) (또한 병렬 알고리즘 용 FPG)
- 나는 이것이 "구현이 스레드를 영원히 멈출 수 없다"고 말하는 것이라고 생각한다.
u8'U', u8'T', u8'F', u8'8'
문자 리터럴 (문자열이 이미 존재 함)- 유형 시스템의 "noexcept"
__has_include
- 헤더 파일 포함이 오류인지 테스트
- 실험에서 표준으로 거의 원활하게 마이그레이션
- 포인터 변환 수정 배열
- 상속 된 생성자 가 일부 코너 케이스 수정 (동작 변경의 예는 P0136R0 참조)
- 상속을 통한 집계 초기화 .
std::launder
, 유형 punning 등
라이브러리 추가 사항:
데이터 타입:
std::variant<Ts...>
- 마지막으로 확인한 거의 항상 비어 있지 않습니까?
- 태그가 지정된 유니온 유형
- {굉장한 | 유용한}
std::optional
- 어쩌면 뭔가를 들고
- 엄청나게 유용함
std::any
- (복사 가능) 무엇이든 보유
std::string_view
- 참조-문자 배열 또는 하위
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>
은 "Args...
Foo
R
과 호환되는 것을 얻을 수 있습니까?"입니다. 여기서R=void
는 기본값입니다.invoke_result<Foo, Args...>
는std::result_of_t<Foo(Args...)>
이지만 덜 혼란 스럽습니까?
File System TS v1
[class.path]
[class.filesystem.error]
[class.file_status]
[class.directory_entry]
[class.directory_iterator]
및[class.recursive_directory_iterator]
[fs.ops.funcs]
fstream
은path
s 및const path::value_type*
문자열로 열 수 있습니다.
새로운 알고리즘
for_each_n
reduce
transform_reduce
exclusive_scan
inclusive_scan
transform_exclusive_scan
transform_inclusive_scan
- 스레딩 목적으로 추가되며 스레드를 사용하지 않는 경우에도 노출됩니다.
스레딩
std::shared_mutex
- Untimed, 필요하지 않은 경우 더 효율적일 수 있습니다.
atomic<T>
::is_always_lockfree
scoped_lock<Mutexes...>
- 한 번에 둘 이상의 뮤텍스를 잠글 때 약간의
std::lock
- 한 번에 둘 이상의 뮤텍스를 잠글 때 약간의
- 병렬성 TS v1
- 2014 년의 링크 된 논문이 오래되었을 수 있습니다.
- 병렬 버전의
std
알고리즘 및 관련 기계
- hardware _ * _ interference_size
(일부)Library Fundamentals TS v1라이브러리 기본 TS v1에서 위 또는 아래에 다루지 않음
[func.searchers]
및[alg.search]
- 검색 알고리즘 및 기술
[pmr]
- 할당 자에 대한
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<>
대한 스 플라이 싱- 컨테이너간에 노드를 저렴하게 이동합니다.
- 전체 컨테이너를 저렴하게 병합하십시오.
- non-const
.data()
for string. - 비 구성원
std::size
,std::empty
,std::data
std::begin
/end
처럼
- 컨테이너에서 불완전한 유형 지원 최소화
- 연속 반복기 "개념"
constexpr
반복자emplace
함수 패밀리는 이제 생성 된 객체에 대한 참조를 반환합니다 .
스마트 포인터 변경
unique_ptr<T[]>
수정 및 기타unique_ptr
조정.weak_from_this
및 일부는 이것에서 공유하도록 수정되었습니다.
기타 표준 데이터 유형 개선::
Misc
- C ++ 17 라이브러리는 C99 대신 C11을 기반으로합니다.
- 향후 표준 라이브러리를 위해 예약 된
std[0-9]+
destroy(_at|_n)
,uninitialized_move(_n)
,uninitialized_value_construct(_n)
,uninitialized_default_construct(_n)
- 대부분의
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
내에서 noexcept에 대한 규칙- 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 ++ 20이며 일부 루머가 암시하는 것처럼 C ++ 19가 아닙니다. C ++ 1O는 피했습니다.
이 reddit 게시물 및 이 reddit 게시물 에서 가져온 초기 목록, 인터넷 검색을 통해 추가 된 링크 또는 위의 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 chrono)
- P0418R2 (원자 조정)
- P0512R0 (템플릿 인수 추론 조정)
- P0490R0 (구조화 된 바인딩 조정)
- P0513R0 (
std::hash
변경) - P0502R0 (병렬 예외)
- P0509R1 (예외 처리에 대한 제한 업데이트)
- P0012R1 (예외 사양을 유형 시스템의 일부로 설정)
- P0510R0 (변형 제한)
- P0504R0 (옵션 / 변형 / 모든 태그)
- P0497R0 (공유 ptr 조정)
- P0508R0 (구조화 된 바인딩 노드 핸들)
- P0521R0 (공유 포인터 사용 횟수 및 고유 변경?)
사양 변경 사항:
추가 참조:
- 연도별로 분류 된 논문; 모두 받아 들여지지는 않는다
- https://isocpp.org/files/papers/p0636r0.html
- 여기에서 "기존 기능에 대한 수정"으로 업데이트해야합니다.
출처 : https://stackoverflow.com/questions/38060436/what-are-the-new-features-in-c17
'프로그래밍 언어 > C++' 카테고리의 다른 글
C ++ 11은 표준화 된 메모리 모델의 도입이 미치는 영향 (0) | 2021.07.28 |
---|---|
C ++ 11에서 람다식이란? (0) | 2021.07.28 |
메서드가 Moq에서 호출되지 않았는지 확인하는 방법 (0) | 2021.07.27 |
gcc의 C / C ++ 소스에서 assembler output 얻는 방법 (0) | 2021.07.27 |
C ++ 표준 int, long 유형의 크기 기준 (0) | 2021.07.27 |