1. if consteval
- if constexpr의 consteval 버전이 생긴다.
2. Deducing this
- 이제 클래스에서 똑같은 함수를 non-const, const 버전으로 두 가지를 만드느라 생기는 중복코드가 대폭 간결해진다.
3. auto(x), auto{x}
- 함수 파라미터에서 rvalue (정확히는 prvalue)로 카피해 전달해주는 기능이다.
예제) 벡터에서 첫 원소와 똑같은 원소를 다 지우고 싶을 때
auto elem = v.front();
std::erase(v.begin(), v.end(), elem);
이 때 auto elem = v.front(); 에서 무조건 복사가 생긴다.
C++ 23부터는 std::erase(v.begin(), v.end(), auto(v.front())); 로 복사를 막을 수 있다.
4. #elifdef, #elifndef, #warning
5. operator[]의 다차원 버전 지원
- n차원 행렬 같은거 짤 때 arr[1, 3, 2, 4] 같은게 가능해진다.
6. static operator()
- 함수 오브젝트의 operator()도 static 멤버 함수로 쓸 수 있다.
7. [[assume]]
- Contract가 C++ 20에 들어가려다가 엎어지고, 그걸 함수의 사전조건과 사후조건을 다른 방식으로 표준에 편입시키는 것으로 합의 되었는데, 이 중 함수의 사전조건을 컴파일러에게 알려주는 attribute다.
라이브러리 관련 주요 기능들
1. 리플렉션
- C++에도 스택 트레이스가 생긴다.
2. std::spanstream
- 본래 C++의 raw char array 버퍼 관련 입출력 스트림은 std::strstream이었다. 이건 90년대 초반에 나온 물건인데, 당시는 RAII 개념도 없었고 std::strstream이 쓰는 char* 버퍼의 메모리 소유권 관리가 매우 해괴한 방식이었기 때문에 std::string이 제대로 보급되고 나서 std::string 기반 std::stringstream을 대신 쓸 것이 권유되고 std::strstream은 무려 24년 전인 C++98에 deprecate 되었다.
3. range 관련 대폭 개선
- ranges::starts_with, ranges::end_with / 파이썬 startswith(), endswith()는 string만 받는데 이건 range를 받는다.
- ranges::contains
- ranges::iota / C++에서도 for i in range(30) 같은 문법이 가능해진다.
- views::zip
- views::chunk, views::slide, views::stride
예제)
std::vector v = {1, 2, 3, 4, 5, 6, 7};
fmt::print("{} ", v | std::views::chunk(2)); // [[1, 2], [3, 4], [5, 6], [7]]
fmt::print("{} ", v | std::views::slide(2)); // [[1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [6, 7]]
fmt::print("{} ", v | std::views::stride(2)); // [1, 3, 5, 7]
- views::repeat / repeat하는 view
- views::cartesian_product / itertools.product()와 같다.
- ranges::to / range의 정보를 어떤 컨테이너 같은 곳에다 저장해야 할 때 쓴다.
예제)
auto even = [](int i) { return 0 == i % 2; };
auto v = ranges::iota(30) | views::filter(even) | ranges::to<std::vector<int>>;
하면 0부터 29까지 숫자 중 짝수로 이루어진 std::vector를 한 줄로 만들 수 있다.
- views::as_rvalue | rvalue로 casting하는 view
4. 표준 라이브러리의 모듈화 지원
- MSVC는 표준 라이브러리를 import std.core; 식으로 모듈화했다.
5. <expected>
예외 처리를 성능 때문에 못 쓰는 사람들은 에러 코드를 써야한다. 이를 expected<T, E> 식으로 만들어서, 함수가 성공적으로 수행되었으면 T에 리턴값이 담기고, 아니면 E에 에러 코드가 담기는 방식을 표준에 넣었다.
6. <flat_map>, <flat_set>
std::set, std::map보다 lookup은 훨씬 더 빠르고 삽입/삭제는 훨씬 더 느린 정렬 컨테이너다.
7. std::mdspan
다차원 span이다. 다차원 행렬을 만들 때 가장 곤란한 submatrix를 쉽게 짜게 해준다.
8. format output 관련 대폭 개선
C++20의 std::format은 뭔가 안 되는게 많아서 그를 대폭 개선한 std::print 등이 나온다.
'프로그래밍 언어 > C++' 카테고리의 다른 글
[C/C++] 부동소수점의 비교연산 안되는 이유 및 오차범위 해결하기 (0) | 2024.05.03 |
---|---|
[C++] 구조체 바이트 패딩 규칙 코드 (structure byte padding or align rule) (0) | 2024.04.24 |
[C] 키 입력받는 함수 GetAsyncKeyState, GetKeyState (1) | 2024.01.13 |
[C++] inline (인라인) 함수란 (0) | 2023.12.21 |
[C++] 입출력 개요 (0) | 2023.12.21 |