C ++ 17의 새로운 기능은 무엇입니까?


1007

C ++ 17은 이제 완전한 기능이므로 큰 변화를 경험할 것 같지 않습니다. C ++ 17에 대한 수백 개의 제안이 제시되었습니다.

C ++ 17에서 C ++에 추가 된 기능은 무엇입니까?

"C ++ 1z"를 지원하는 C ++ 컴파일러를 사용할 때 컴파일러가 C ++ 17로 업데이트 할 때 어떤 기능을 사용할 수 있습니까?


26
연타에 따라 기능의 전체 목록 : 라이브러리 , 핵심 언어 .
Kerrek SB

3
이 블로그 bost는 좋은 요약을 가지고 있습니다 : bfilipek.com/2017/01/cpp17features.html
atb

13
C ++ 14에서 C ++ 17 로의 주요 변경 사항 목록은 C ++ 14와 C ++ 17 DIS 의 공식 변경 사항 (P0636r0) 문서를 참조하십시오.
jotik

1
트윗 담아 가기 C ++ 20 섹션이 유지 보수됩니까? 거기 # 53 ...하지만이 닫혀
LF

이 사이트 en.cppreference.com/w/cpp의 모든 내용에는 필요한 버전이 표시되어 있습니다.
jw_ 2014

답변:


1266

언어 특징 :

템플릿 및 일반 코드

람다

속성

구문 정리

보다 깨끗한 멀티 리턴 및 흐름 제어

  • 구조적 바인딩

    • 기본적으로, 일류 std::tieauto
    • 예:
      • const auto [it, inserted] = map.insert( {"foo", bar} );
      • 변수 작성 itinserted으로부터 유추 유형을 pairmap::insert돌아갑니다.
    • 튜플 / 페어 std::array유사 및 비교적 평평한 구조체 와 함께 작동
    • 표준에서 실제로 명명 된 구조적 바인딩
  • if (init; condition)switch (init; condition)

    • if (const auto [it, inserted] = map.insert( {"foo", bar} ); inserted)
    • 눈에 띄게 변환 할 수없는 if(decl)경우로 확장합니다 decl.
  • 범위 기반 for 루프 일반화

    • 센티널 또는 시작 반복자와 같은 유형이 아닌 종료 반복자를 대부분 지원하는 것으로 보이며, 이는 널 종료 루프 등을 도와줍니다.
  • 만약 constexpr이라면

    • 거의 일반적인 코드를 단순화하는 기능을 많이 요청했습니다.

기타

도서관 추가 :

자료형

  • std::variant<Ts...>

    • 거의 항상 비어 있지 않은 마지막 확인 했습니까?
    • 태그 조합 유형
    • {awesome | 유용한}
  • std::optional

    • 어쩌면 뭔가 중 하나를 보유하고
    • 엄청나게 유용한
  • std::any

    • 무엇이든 보관 가능 (복사 가능)
  • std::string_view

    • std::string 참조-문자 배열 또는 부분 문자열과 유사
    • string const&다시는 가져 가지 마십시오 . 또한 bajillion 시간을 더 빨리 구문 분석 할 수 있습니다.
    • "hello world"sv
    • constexpr char_traits
  • std::byte 그들이 씹을 수있는 것보다 더 많이

    • 정수도 문자도 데이터가 아닙니다

물건을 불러

파일 시스템 TS v1

새로운 알고리즘

  • for_each_n

  • reduce

  • transform_reduce

  • exclusive_scan

  • inclusive_scan

  • transform_exclusive_scan

  • transform_inclusive_scan

  • 스레드 사용을 위해 추가되었으며 스레드를 사용하지 않더라도 노출됩니다.

스레딩

라이브러리 기초 TS v1 위 또는 아래에 포함되지 않은 부분

컨테이너 개선

스마트 포인터 변경

다른 std데이터 유형 개선 :

기타

특성

더 이상 사용되지 않음

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 ++로 제거 ​​된 몇 가지 (대부분 이전에 더 이상 사용되지 않음) 목록은 다음과 같습니다.

제거 :

다시 말해서 이것이 코드에 영향을 주거나 표준에서 정리되었는지 확실하지 않습니다.

아직 위에 통합되지 않은 논문 :

  • P0505R0 (constexpr 크로노)

  • P0418R2 (원자 조정)

  • P0512R0 (템플릿 인수 공제 조정)

  • P0490R0 (구조적 바인딩 조정)

  • P0513R0 (로 변경 std::hash)

  • P0502R0 (병렬 예외)

  • P0509R1 (예외 처리에 대한 제한 사항 업데이트)

  • P0012R1 (예외 사양을 유형 시스템의 일부로 설정)

  • P0510R0 (변형에 대한 제한 사항)

  • P0504R0 (선택 / 변형 / 모든 태그)

  • P0497R0 (공유 ptr 조정)

  • P0508R0 (구조적 바인딩 노드 핸들)

  • P0521R0 (공유 포인터 사용 횟수 및 고유 한 변경?)

사양 변경 :

추가 참조 :


2
음, memory_order_consume공식적으로 더 이상 사용되지 않는 것 같습니다. 그것은 메모에서 권장하지 않습니다. 어쩌면 이것을 언급하는 것이 합리적입니까?
LF
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.