문서의 임의 삭제는 제재 대상으로, 문서를 삭제하려면 삭제 토론을 진행해야 합니다. 문서 보기문서 삭제토론 C++ (문단 편집) ==== C++17 ==== ||<:>C++17 모듈 목록|| ||<:> {{{#!wiki style="margin: 0 -10px" {{{#!folding [ 펼치기 · 접기 ] ||<:>{{{}}}||<:>{{{}}}||<:>{{{}}}||<:>{{{}}}|| ||<:>{{{}}}||<:>{{{}}}||<:>{{{}}}|| ||<:>{{{}}}||<:>{{{}}}||<:>{{{}}}||<:>{{{}}}||<:>{{{}}}|| ||<:>{{{}}}||<:>{{{}}}||<:>{{{}}}||<:>~~{{{}}}~~||<:>{{{}}}|| ||<:>{{{}}}||<:>~~{{{}}}~~||<:>{{{}}}||<:>{{{}}}|| ||<:>{{{}}}||<:>{{{}}}||<:>{{{}}}||<:>{{{}}}|| ||<:>{{{}}}||<:>{{{-1 {{{}}}}}}||<:>{{{}}}||<:>{{{}}}||<:>{{{}}}|| ||<:>{{{}}}||<:>{{{}}}||<:>{{{}}}||<:>{{{}}}||<:>{{{}}}|| ||<:>{{{}}}||<:>{{{}}}||<:>{{{-1 {{{}}} }}}||<:>{{{-1 {{{}}} }}}||<:>{{{}}}|| ||<:>{{{}}}||<:>{{{}}}|| ||<:>{{{}}}||<:>{{{}}}||<:>{{{}}}||<:>{{{}}}||<:>{{{}}}|| ||<:>{{{}}}||<:>{{{}}}||<:>{{{-1 {{{}}}}}}||<:>{{{-1 {{{}}}}}}|| ||<:>{{{}}}||<:>{{{}}}|| ||<:>{{{}}}||<:>{{{}}}||<:>{{{}}}||<:>{{{-1 {{{}}}}}}||<:>{{{}}}|| ||<:>{{{}}}||<:>{{{}}}||<:>{{{}}}||<:>{{{}}}|| }}} }}} || [[2017년]] 12월에 C++'''1z'''로 알려졌던 C++17 표준이 ISO/IEC 14882:2017이라는 정식 명칭으로 최종 승인되었다. C++11의 추가 요소들을 다듬고 향상시키는데 주력했던 C++14에 비해, C++17은 표준 라이브러리의 새로운 기능에 비교적 주력한다. 초안 단계에서부터 논란이 많은 표준안이기도 하다. C++11/14의 실정에 맞추어 옛날 기능을 삭제하자는 안이 많기 때문인데[* C++11 제정 당시에도 {{{std::auto_ptr}}} 등 많은 옛날 요소들이 deprecated로 명시되어 사용이 자제될 것을 권장받았으나, 이는 어디까지나 권고라 사용자가 맘 놓고 쓰려면 쓸 수 있었다. 이전 버전의 기능을 아예 죽여버린 사례는, C++98 시절에 실상 누구도 안 썼고 지금은 아예 용도가 바뀌어버린 {{{auto}}} 등 극소수만이 해당한다.], deprecated 판정을 받은 {{{std::auto_ptr}}}이나 삼중자(trigraph)[* C/C++의 특수기호는 미국의 부호체계인 [[ASCII]]를 기반으로 하고 있기 때문에 해당 영역에 다른 문자를 넣어 사용하던 유럽국가들의 코드페이지에서는 이상하게 표현되는 일이 있었다. 그래서 잘 사용하지 않는 문자의 조합으로 특수문자를 표기하는 방법. 문자 2개의 조합이면 digraph, 3개면 trigraph. 유니코드가 대세가 된 지금은 사실 필요 없고, 옛날 소스라고 해도 간단한 일괄 변환작업으로 새 표준에 맞출 수 있기도 하다. 다만 표준에서 삭제처리를 할 경우 해당 문법이 '''다른 기능으로 대체될 수 있기 때문에''' 일괄변환이 언제나 될 것이라는 보증이 안 되고, 후술하는 IBM 등 장기간의 낡은 코드와 관련된 이해관계자들 입장에서 떨떠름한 것은 사실이다.] 등이 삭제되었다. 이는 옛 코드에 대한 호환성을 포기하는 것이기 때문에, 오래된 코드들이 최신 컴파일러에서 컴파일되지 않을 가능성이 크다. 이 때문에 IBM에서 문자체계의 문제를 내세워 삼중자를 제거하지 말라고 회사 차원에서 표준화 위원회에 진정서를 제출했었다. [[http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4210.pdf|#]] [[Visual Studio]]의 경우 2017 이상, [[GCC]]의 libstdc++의 경우 9 이상에서 지원한다. 1. {{{}}} 정적인 문자열 클래스 1. {{{}}} 전달하는 값의 존재 여부를 선택적으로 결정할 수 있는 클래스 1. {{{}}} 파일 시스템 지원 1. {{{}}} 병렬 [[STL]] 알고리즘 1. {{{}}} 타입 안전한 결합체 ({{{union}}}) 1. 템플릿 인자 추론 {{{#!syntax cpp template class Aaa {}; template Aaa(T) -> Aaa;}}}와 같이 사용자가 템플릿의 추론 방법을 직접 명시할 수 있음. 가령 {{{std::vector v{1, 2, 3};}}}의 경우 v는 {{{std::vector}}}로 연역됨. 1. 구조적 바인딩: 튜플 또는 집합 구조체를 풀어쓰는 기능을 제공함. 가령 {{{auto [a, b, c] = std::tuple(4, 5, 6);}}}에서 {{{a}}}는 4, {{{b}}}는 5, {{{c}}}는 6이 됨 1. 클래스의 객체를 생성하기 위해 생성자에 바로 같은 클래스 객체를 전달했을때, 해당 클래스의 이동 생성자가 존재한다면 ''순수한 R-Value''가 되어 마치 존재하지 않은 것처럼 처리됨. 예를 들어 이동 생성자가 있는 클래스 A를 생성할 때 {{{A aaa{A{}};}}}에서 안쪽의 {{{A{}}}}는 코드 상에만 보이고 실행 시점에는 보이지 않는 존재가 됨 1. {{{noexcept}}} 속성이 함수의 자료형에 포함됨. 함수 포인터, 람다 표현식, 함자 객체에서 {{{noexcept}}}를 명시한 것과 하지 않은 것이 다른 함수로 취급됨 1. 람다 표현식의 문맥 캡처 부분에 {{{this}}}를 사용할 수 있음. 이를 통해 자신의 메서드, 필드만 캡처할 수도 있음 1. {{{constexpr}}} 람다 표현식 1. {{{if constexpr}}} {{{if}}}문과 사용법은 같지만, 평가되고 실행되는 내용은 컴파일 시점에 즉시 결정됨. 실행되지 않는 쪽은 아예 코드에서 제거됨. 이를 이용해 오버로딩 없이 완전 다른 자료형을 반환하는 함수를 만들 수 있음 1. {{{inline}}}을 변수 선언에 사용할 수 있음. {{{static inline}}} 필드는 선언 즉시 값을 할당할 수 있음. 어떤 이름공간 안에 있는 {{{inline constexpr}}} 변수는 {{{static}}} 변수처럼 중복 선언이 일어나지 않으며 항상 단일하게 존재하는 이름이 됨. 템플릿 {{{inline constexpr}}} 변수는 늦게 평가되며 컴파일 시점에 값이 그대로 대입됨. 그리고 {{{static constexpr}}}의 경우 자동으로 {{{static inline constexpr}}}로 연역됨 1. 중첩되는 이름공간을 {{{namespace ns1::ns2 { ...; }}}}와 같이 바로 선언할 수 있음 1. 이름없는 매개 변수가 가능해짐. 함수에 {{{std::in_place}}}, {{{std::in_place_type}}} 같은 메타 인자를 전달할 때 유용함 1. {{{Enum en{ value };}}}과 같이 열거형의 생성, 대입을 형변환 없이 바로 할 수 있음. 이는 {{{enum class}}}에도 적용됨 1. {{{enum class std::byte}}} 1. 번거롭게 {{{alignas}}}를 클래스에 붙일 필요 없이 {{{std::aligned_alloc}}}로 동적으로 메모리 정렬과 동시에 할당이 가능해짐 1. {{{constexpr std::array}}} 1. 새로운 특성 {{{[[fallthrough]]}}} 1. 새로운 특성 {{{[[maybe_unused]]}}} 1. 새로운 특성 {{{[[nodiscard]]}}}, {{{[[nodiscard(message)]]}}} 그외 새로운 기능들은 [[https://stackoverflow.com/questions/38060436/what-are-the-new-features-in-c17|이곳에]] 잘 정리되어 있다.저장 버튼을 클릭하면 당신이 기여한 내용을 CC-BY-NC-SA 2.0 KR으로 배포하고,기여한 문서에 대한 하이퍼링크나 URL을 이용하여 저작자 표시를 하는 것으로 충분하다는 데 동의하는 것입니다.이 동의는 철회할 수 없습니다.캡챠저장미리보기