>  기사  >  백엔드 개발  >  C++17의 최종 기능

C++17의 최종 기능

黄舟
黄舟원래의
2017-02-06 14:15:021364검색

최근 몇 주 동안 C++ 위원회는 C++17의 최종 기능이 결정되고 곧 국제 표준이 될 예정인 오울루에서 회의를 가졌습니다. 잭슨빌에서 열린 마지막 회의 이후에는 C++17이 큰 놀라움을 가져올 것이라는 큰 기대는 없었지만, Oulu 회의에서는 중요하고 흥미로운 기능을 새로운 C++17 표준에 추가하기 위해 열심히 노력했습니다. Reddit 페이지는 C++17 기능에 대한 좋은 개요를 제공하며 Herb Sutter는 최근 CppCast 사이트(및 여행 보고서)에서 C++17 기능에 대한 좋은 통찰력을 제공했습니다. 또한 Michael Wong은 C++17 기능에 대한 보다 완전한 개요를 제공합니다.


중요한 사항부터 먼저 말씀드리겠습니다


아까 말씀드렸듯이 잭슨빌 회의 회의 후 , C++17의 많은 기능이 매우 명확해졌습니다. 저는 C++17로 전환할지 여부에 대한 조언을 제공하는 세 부분으로 구성된 블로그 시리즈를 작성했습니다. 우리는 C++의 새로운 세기를 맞이할 것이며 관련 표준은 강력한 기술 사양과 함께 출시될 것이며 이는 차세대 C++ 표준의 일부가 될 것입니다. 이는 C++17이 아닌 기능(예: 개념 또는 모듈)이 향후 컴파일러 릴리스에서 플러그인으로 제공될 것임을 의미합니다. Visual Studio는 현재 모듈을 제공하지만 GCC는 개념을 지원하는 최초의 컴파일러입니다. Clang은 모듈도 지원하며 Visual Studio와 Clang 모두 곧 모듈 TS 기반 사양을 구현할 예정입니다. 3bb3ba5d8a8c1e677360c9d603cb067b C++ 표준은 새로운 콘텐츠를 추가하지 않지만 다소 변경 사항이 있을 것입니다. 하지만 저는 여전히 이러한 모든 기능이 최종 검토에서 통과되기를 바랍니다.


C++17의 마지막 하이라이트


std::variant


가장 놀랐던 것부터 시작해보겠습니다. 바로 변주에요. 예, 진지하게 C++17에서는 std::variant를 제공합니다. 이는 매우 훌륭하며 변형 및 기타 관련 아이디어를 기반으로 미래 기능을 위한 길을 열어줍니다. 예를 들어, 스타일 일치에 대해서는 C++에서 이에 대한 정말 좋은 이야기가 있습니다. David Sankel에 따르면 std::variant는 Boost::variant 및/또는 기타 변형 라이브러리 이후에 설계되었습니다. Boost::variant


variant<int, float> v, w;
v = 12;int i = get<int>(v);
w = get<int>(v);
w = get<0>(v); // same effect as the previous linew = v; // same effect as the previous lineget<double>(v); // ill formedget<3>(v); // ill formedtry {
  get<float>(w); // will throw.}catch (bad_variant_access&) {}

와 매우 유사한 API가 있습니다. TS 우회를 채택하는 대신 이 기능이 C++17 표준에 포함된 것을 보니 매우 기쁩니다.

if constexpr(expression)

이것은 (거의) 정적 if의 C++ 버전입니다. 나에게 이것은 잭슨빌의 하이라이트 중 하나였지만 당시에는 그다지 인기가 없었습니다. 기대에 부응하여 Oulu의 C++17 최종 검토를 통과했습니다. 이를 사용하면 컴파일 중에 constexpr이 true로 평가되는 경우 C++에서 특정 명령문 블록을 쉽게 컴파일할 수 있습니다.

if constexpr (std::is_integer ...) 
{ //integerstuff }
else if constexpr (std::is_floating_point ...) 
{ //floatingpointstuff }
else { // NaN ;) }

이 예는 이를 명시적으로 보여줍니다. 예, constexpr은 판단되어야 합니다. 컴파일 중에는 true가 되어야 하지만 static_assert에는 영향을 주지 않습니다. 명령문 블록에서 선택되지 않은 static_asserts는 계속 트리거됩니다. 이는 표준에 적합하지 않습니다.


또 다른 흥미로운 점: 이 기능은 if constexpr로 작성되었지만 표준 철자법에서는 여전히 constexpr if로 이름을 지정하지만 if constexpr로 정의합니다.


템플릿에서 auto 사용


C++14의 경우 익명 표현식은 auto를 사용하여 제네릭을 정의할 수 있습니다. . 현재 auto를 사용하여 (비유형) 템플릿 매개변수를 정의할 수도 있습니다. auto가 class나 typename보다 짧기 때문에 템플릿 코드 작성이 더 쉬워집니다. auto를 사용하여 가변 길이 템플릿 매개변수를 정의할 수도 있습니다(예: template6b4b5c6a4dca2aea2d2f974ee580bfa1).


구조적 바인딩


지금까지 std를 자유롭게 사용하는 유명한 트릭이 사용되었습니다. :tie 결과 유형을 수동으로 처리할 필요 없이 튜플 또는 고유 변수 쌍을 직접 할당합니다. 이것은 트릭이며 변수가 존재해야 합니다. 이제 변수를 선언하고 한 줄로 초기화할 수 있습니다.

auto [a , b , c] = getvalues();

대괄호가 부족하지 않아야 하며 getvalues는 튜플을 반환합니다. 권장 사항에는 std::pair에 대한 언급이 없으므로 pair 사용도 제대로 작동할지 확실하지 않으며 일부 삽입 메서드에서 STL에 의해 반환됩니다.


초기화로 전환하고


이제 if 문에서 변수를 정의할 수 있습니다: if(int x = 42; true != false). 이는 이전 제안과 결합될 수 있습니다. if 문에 정의된 변수는 else 부분에서도 유효합니다. 나는 이것을 달성하기 위해 중괄호와 같은 트릭을 제안하는 현대 C++ 디자인을 기억하지만 그것은 단지 단일 변수에 대한 것입니다.


이 경우를 사용하는 것은 흥미롭습니다. 예를 들어 if 또는 스위치를 잠그면 이러한 함수에서 반환된 모든 상태 코드를 이제 if 내에서 처리할 수 있습니다. 기본적으로 이는 { var x = value; if(...){}else{}} 를 작성하는 것과 같습니다.

더보기

이것이 전부는 아닙니다. 예를 들어 복사 제거(복사본 제거) 개선을 위해 std[0-9]+ 네임스페이스는 향후 표준을 위해 예약되어 있습니다. 또한 reddit에 대한 흥미로운 토론과 의견이 많이 있습니다.

C++ 17 표준은 점차 발전하고 개선되고 있으며, 표준화된 도구도 성숙되어 사용되고 있습니다. 이는 C++의 가장 큰 이점입니다. 다음 C++ 표준에 기여하고 싶은 사람들은 지금부터 계획을 세우는 것이 좋습니다. C++의 표준화는 항상 자원 봉사자들에 의해 추진되어 왔습니다. 이를 수행할 돈은 없으며 기본적으로 모든 사람은 C++와 관련된 일상 업무를 수행합니다. isocpp.org를 확인해 보시기 바랍니다. 여기에는 여러분이 참여할 수 있는 매우 훌륭하고 자세한 소개가 있습니다.

위 내용은 C++17의 최종 기능 내용입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.