C++23

C++ 언어 버전 **C++23**, 공식적으로 **ISO/IEC 14882:2024**,website=iso.org는 C++20에 이어지는 C++ 프로그래밍 언어의 현재 개방형 표준이다. 이 버전의 최종 초안은 N4950이다.archive-date= Feb 16, 2024archive-date=2023-06-05 2020년 2월, 프라하에서 열린 C++20 최종 회의에서 C++23에 대한 전체 계획이 채택되었다.access-date=2020-02-13access-date=2020-02-13 C++23의 계획된 기능은 코루틴을 위한 라이브러리 지원, 모듈화된 표준 라이브러리, 실행자(executor), 네트워킹이었다. C++23에 초점을 맞춘 첫 WG21 회의는 2020년 6월 초 바르나에서 열릴 예정이었으나, 코로나19 범유행으로 인해 취소되었다.archive-date= Feb 12, 2024date=29 July 2020 2020년 11월 뉴욕 회의website=isocpp.org와 2021년 2월 코나(Kona) 회의도 마찬가지였다. 2022년 11월까지 모든 회의는 가상으로 진행되었고, 2022년 11월 회의부터 2023년 2월 최종 회의까지는 하이브리드 형식으로 진행되었다. 이 표준은 2023년 2월 이서콰에서 열린 하이브리드 회의에서 WG21에 의해 기술적으로 최종 확정되었다.date=13 February 2023
# 현대적인 "Hello, world" 예제
작업 초안에 많은 라이브러리 변경 사항이 적용된 후, 새로운 "Hello, world" 프로그램은 다음과 같다. import std; int main() { std::println("Hello, world!"); }
# 기능
C++23에 승인된 변경 사항은 다음과 같다.
## 언어
*명시적 `this` 객체 매개변수author4=Barry Revzin *`if consteval`author4=Daveed Vandevoorde *다차원 첨자 연산자author5=Christian Trott *정적 호출 및 첨자 연산자와 정적 람다date=2022-04-08date=2022-11-11 *암시적 이동 단순화date=2022-03-23 *`auto(x)` 및 `auto{x}`author=Zhihao Yuan *새로운 전처리기 지시문: **`#elifdef` 및 `#elifndef`author=Melanie Blower **`#warning`author=Aaron Ballman *범위 기반 for 루프에서 일부 임시 변수의 수명 연장date=2022-11-11 *새로운 표준 속성 `assume(expression)`date=2022-04-22 *상속된 생성자로부터의 클래스 템플릿 인자 추론author=Timur Doumler *복합 문의 끝에 있는 레이블date=2022-01-13 *초기화 문 내의 별칭 선언author=Jens Maurer *`std::size_t` 및 해당 부호 있는 타입에 대한 리터럴 접미사date=2019-11-24 *리터럴을 포함한 확장 부동 소수점 타입 (조건부 지원)date=2022-04-22 *널리 람다 표현식의 선택적 `()`date=2020-12-11 *람다 표현식의 속성title=Attributes on Lambda-Expressions *`constexpr` 변경 사항: **`constexpr` 함수 내의 비리터럴 변수, 레이블 및 `goto`author=Ville Voutilainen **`constexpr` 함수 내에서 상수 표현식으로 사용 가능한 `static` 및 `thread_local` 변수 허용date=2022-11-07 **`constexpr` 함수는 반환 타입과 매개변수 타입이 리터럴 타입일 필요가 없다. **핵심 상수 표현식의 요구 사항을 만족하는 호출이 없는 `constexpr` 함수를 작성하는 것이 이제 가능하다.date=2022-01-27 *`static_assert` 및 `if constexpr`에서 `bool`로의 컨텍스트적 축소 변환author=Andrzej Krzemieński *라인 연결 전 공백 제거author=Corentin Jabot *선언 순서 레이아웃 의무화author1=Pal Balog *구분된 이스케이프 시퀀스date=2022-02-25 *이름 있는 유니버설 문자 이스케이프date=2022-03-25 *텍스트 인코딩 변경 사항: **이동 가능한 소스 파일 인코딩으로 UTF-8 지원date=2022-07-01 **일관된 문자 리터럴 인코딩author=Corentin Jabot **문자 집합 및 인코딩author=Jens Maurer *`this`와 같은 일부 키워드에 새로운 의미 추가..website=en.cppreference.com
## 라이브러리

### 표준 라이브러리 모듈 지원
*표준 라이브러리 모듈 `std` 및 `std.compat`title=Standard Library Modules std and std.compat
### 코루틴 라이브러리 지원
*범위에 대한 동기식 코루틴 `std::generator`title=(std::generator: Synchronous Coroutine Generator for Ranges)
### 일반 유틸리티 지원
*결과 타입 `std::expected`author3=Jonathan Wakely *`std::optional`author=Sy Brand 및 `std::expected`author=Jeff Garland을 위한 모나드 연산 *enum의 기본 값을 가져오는 유틸리티 함수 `std::to_underlying`author=JeanHeyd Meneide *이동 전용 호출 가능 래퍼 `std::move_only_function`author2=Ryan McDougall *`std::forward_like`author=Gašper Ažman *`std::invoke_r`author=Zhihao Yuan *`std::bind_back` *`std::byteswap`author2=Corentin Jabot *`std::unreachable`: 접근할 수 없는 코드를 표시하는 함수author2=Jens Maurer *`std::tuple`을 다른 튜플 유사 객체와 호환 가능하게 만들었다.author=Corentin Jabot *참조 타입을 반환하는 `std::reference_wrapper`에 대한 `std::basic_common_reference` 특수화 추가author3=Tim Song *`std::pair`의 전달 생성자에 대한 기본 인자 추가date=2022-11-11
### 컴파일 시간 지원
*`constexpr` 지원: **`std::type_info::operator==`author=Peter Dimov ** `std::bitset`author=Daniil Goncharov ** `std::unique_ptr`author=Andreas Fertig ** 일부 `` 함수author2=Oliver J. Rosten ** `std::to_chars` 및 `std::from_chars`의 정수 오버로드author2=Alexander Karaev *메타프로그래밍 유틸리티: **타입 트레잇 `std::is_scoped_enum`,author=Juan Alday `std::is_implicit_lifetime`,author2=Vittorio Romeo `std::reference_constructs_from_temporary`, 및 `std::reference_converts_from_temporary`.author=Tim Song *비교 개념에 대한 이동 전용 타입 지원 추가author=Justin Bassett
### 이터레이터, 범위 및 알고리즘 지원
*새로운 범위 변환 함수 `std::ranges::to`author3=Casey Carter *새로운 제약이 있는 범위 알고리즘: **`std::ranges::starts_with` **`std::ranges::ends_with`author=Christopher Di Bella **`std::ranges::contains` **`std::ranges::contains_subrange`author=Christopher Di Bella **`std::ranges::find_last` 및 기타 변형author=Zach Laine **`iota`, `shift_left` 및 `shift_right`의 범위화된 버전author=Tim Song **범위 폴드 알고리즘author=Barry Revzin *새로운 `std::ranges::range_adaptor_closure`, 사용자 정의 범위 어댑터 클로저를 정의하기 위한 헬퍼author=Barry Revzin *새로운 범위 어댑터: **`std::views::zip` 및 기타 변형 **`std::views::adjacent` 및 기타 변형author=Tim Song **`std::views::join_with`author=Barry Revzin **`std::views::slide` **`std::views::chunk`author=Tim Song **`std::views::chunk_by`author=Tim Song **`std::views::as_rvalue`author=Barry Revzin **`std::views::as_const` **`std::views::repeat`author=Michał Dominiak **`std::views::stride`author2=Tim Song **`std::views::cartesian_product`author2=Michał Dominiak **`std::views::enumerate`author=Corentin Jabot *상수 이터레이터, 센티넬 및 범위를 수정하여 `std::ranges::cbegin` 및 기타 유사 유틸리티가 얕은 상수 뷰(예: `std::span`)의 경우에도 상수 이터레이터를 반환하도록 완전히 보장한다.author=Barry Revzin *비범위 알고리즘의 입력으로 범위 이터레이터author=David Olsen *이동 전용 타입을 허용하도록 범위 어댑터 완화author=Michał Dominiak *일부 뷰의 다중 매개변수 생성자를 `explicit`으로 만들었다.author=Ville Voutilainen
### 메모리 관리 지원
*C 상호 운용성을 위한 `std::out_ptr` 및 `std::inout_ptr`author3=Isabella Muerte *`std::allocate_at_least` 및 `std::allocator::allocate_at_least`author2=Chris Kennelly *암시적 수명 타입에 대한 명시적 수명 관리 함수 `std::start_lifetime_as`author2=Richard Smith *`std::allocator_traits`의 사용자 특수화 금지author=Pablo Halpern
### 문자열 및 텍스트 처리 지원
*새로운 멤버 함수 및 문자열 타입의 변경 사항: **`std::basic_string_view::contains` 및 `std::basic_string::contains`date=2020-06-13 **`std::basic_string` 및 `std::basic_string_view`에 대한 `nullptr`로부터의 생성 비활성화author=Yuriy Chernyshov **`std::basic_string_view`에 대한 명시적 범위 생성자author=Corentin Jabot **`std::basic_string::resize_and_overwrite`author2=Mark Zeren **효율적인 슬라이싱을 위한 `std::basic_string::substr`의 rvalue 참조 오버로드title=std::string::substr() && *범위, 튜플, 문자 및 문자열의 이스케이프된 표현, `std::thread::id` 및 스택 트레이스 포매팅.date=16 May 2022author=Barry Revzinauthor2=Victor Zverovich
### 진단 지원
*스택 트레이스 라이브러리date=2020-09-16
### I/O 지원
*새로운 헤더 ``에서 가져온 서식 있는 출력 함수 `std::print` 및 `std::println`title=Formatted output *새로운 헤더 ``에서 가져온 spanstream 라이브러리(`std::span` 기반 문자열 스트림)author=Peter Sommerlad *`std::fstream`에서 독점 모드 지원title=Support exclusive mode for fstreams *`std::basic_ostream::operator` 헤더)
# 기술 사양으로 발행됨
* Concurrency TS v2title=Programming Languages — Technical specification for C++ extensions for concurrency 2
# 컴파일러 지원
* 클랭은 2021년 버전 13부터 2024년 버전 18까지 C++23 부분 지원을 점진적으로 추가했으며, 옵션 `-std=c++23`을 통해 사용할 수 있다.title=C++ Support in Clang * GCC는 2021년 버전 11에서 옵션 `-std=c++2b` 또는 `-std=c++23`을 통해 C++23의 부분적, 실험적 지원을 추가했다. 또한 실험적인 C++23 지원 외에 GNU 확장을 활성화하는 옵션 `-std=gnu++2b`도 있다.title=C++ Standards Support in GCC - GNU Project
# 역사
대면 WG21 회의가 없는 상황에서, 다음 변경 사항들은 여러 가상 WG21 회의 후 적용되었으며, 여기서 여론조사(straw poll)를 통해 승인되었다.
## 2020년 11월
2020년 11월 9일 가상 WG21 회의 후 다음 사항들이 추가되었으며, 여론조사를 통해 승인되었다.url=http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/n4877.pdf * `std::size_t` 및 해당 부호 있는 타입에 대한 리터럴 접미사 * 주어진 부분 문자열 또는 문자를 문자열이 포함하는지 확인하는 `std::basic_string` 및 `std::basic_string_view`에 대한 멤버 함수 contains * Boost.Stacktrace를 기반으로 하는 스택 트레이스 라이브러리 () * 타입 트레잇 std::is_scoped_enum * C 원자(atomic)와의 상호 운용성을 위한 헤더
## 2021년 2월
2021년 2월 22일 가상 WG21 회의 후, 다음 기능들이 추가되었으며 여론조사를 통해 승인되었다.url=http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/n4877.pdf * 람다 표현식에서 불필요한 빈 매개변수 목록 () 제거. * 입력 범위 어댑터 및 counted_iterator 수정. * time_point::clock에 대한 요구 사항 완화.author2=Howard Hinnant * std::variant에서 파생된 클래스에 대한 std::visit. * 잠금 가능 객체를 잠근다.author=Tim Song * 조건부로 빌려온 범위. * std::to_underlying.
## 2021년 6월
2021년 6월에 열린 여름 ISO C++ 표준 본회의 가상 회의 후, 새로운 기능과 결함 보고서가 여론조사를 통해 승인되었다.url=http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/n4891.pdf * Consteval if (1=if consteval). * 1=bool로의 컨텍스트적 축소 변환. * 중복 속성 허용. * std::span 기반 문자열 스트림 (). * std::out_ptr() 및 std::inout_ptr(). * std::optional, std::variant 및 1=std::type_info::operator==에 대한 2=cpp. * std::stack (스택) 및 std::queue (큐)에 대한 이터레이터 쌍 생성자. * 범위 라이브러리의 몇 가지 변경 사항: ** 임의 범위에 대한 일반화된 starts_with 및 ends_with. ** split_view를 lazy_split_view로 이름 변경 및 새로운 split_view. ** join_view에 대한 제약 완화. ** 개념 view에서 default_initializable 제약 조건 제거. ** std::basic_string_view에 대한 범위 생성자. * 2=cpp로부터의 std::basic_string 및 std::basic_string_view 생성 금지. * std::invoke_r. * std::format 개선. * std::pair의 전달 생성자에 기본 인자 추가.
## 2021년 10월
2021년 10월에 열린 2021년 가을 ISO C++ 표준 본회의 가상 회의 후, 새로운 기능과 결함 보고서가 여론조사를 통해 승인되었다.url=https://isocpp.org/files/papers/N4898.pdf * 비리터럴 변수, 레이블 및 `goto`가 1=constexpr 함수에 허용되었지만, 컴파일 시간에 평가하는 것은 여전히 잘못된 형식이다. * 명시적 2=cpp 객체 매개변수. * 문자 집합 및 인코딩 변경 사항. * 새로운 전처리기: #elifdef 및 #elifndef. 두 지시문은 C23 (C 언어 업데이트) 및 GCC 12에 추가되었다.url-status=live * 초기화 문에서 별칭 선언 허용. * 다차원 첨자 연산자 오버로드 (예: arr[1, 2]). * 언어 내 decay copy: 1=auto(x) 또는 1=auto(x). * 텍스트 포매팅 라이브러리 변경 사항: ** chrono 포매터에서 로케일 처리 문제 해결. ** std::generator 유사 타입을 허용하기 위해 형식 인자에서 전달 참조 사용. * std::pmr::polymorphic_allocator와 동등한 타입 별칭 std::pmr::stacktrace 추가.author=Steve Downey * 범위 라이브러리 변경 사항: ** 뷰의 정제된 정의. ** 함수 템플릿 std::ranges::istream_view를 별칭 템플릿 std::ranges::istream_view, std::ranges::wistream_view 및 사용자 정의 지점 객체 std::views::istream으로 대체. ** zip 범위 어댑터 패밀리: *** zip_view *** zip_transform_view *** adjacent_view (및 std::views::pairwise는 std::views::adjacent와 동등) *** adjacent_transform_view (및 std::views::pairwise_transform는 std::views::adjacent_transform와 동등) * std::move_only_function. * std::optional에 대한 모나드 연산. * 멤버 함수 템플릿 std::basic_string::resize_and_overwrite. * cpp 포인터 출력 (1=volatile T*). * std::byteswap. * 연관 컨테이너에 대한 이기종 삭제 오버로드. * std::span 및 std::basic_string_view의 모든 특수화는 사소하게 복사 가능하다. * std::exchange에 조건부 1=noexcept 사양 추가.author=Giuseppe D'Angelo * 정수 클래스 타입의 사양 및 사용 개편.author=Tim Song * C 헤더 명확화. "헤더는 C++로만 유효해야 하는 코드에서는 유용하지 않다. 따라서 C 헤더는 C++ 표준 라이브러리에서 완전히 지원되고 폐기되지 않은 부분으로 제공되어야 하지만, 다국어 상호 운용 코드(polyglot interoperability code)가 아닌 코드에서는 사용이 권장되지 않는다. [..] 이 제안은 C 헤더를 더 이상 폐기되지 않도록 하여 향후 제거될 formal threat를 없앤다. 순수 C++ 코드에서 C 헤더 사용을 자제하도록 하는 실질적인 권장 사항은 이제 규범적 권장 사항으로 명시적으로 명시된다."author=Thomas Köppe
## 2022년 2월
2022년 2월 7일 가상 WG21 회의 후, 다음 기능들이 추가되었으며 여론조사를 통해 승인되었다.url=http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/n4907.pdf * 람다의 함수 호출 연산자에 속성 허용 * std::expected * `cmath` 및 `cstdlib`에 대한 constexpr * 접근할 수 없는 코드를 표시하는 함수 * ranges::to * 임시 객체에 대한 참조 바인딩을 감지하는 타입 트레잇 * std::unique_ptr를 constexpr로 만들기 * 사용자 정의 범위 어댑터에 대한 파이프 지원 * ranges::iota, ranges::shift_left 및 ranges::shift_right * views::join_with * 윈도잉 범위 어댑터: views::chunk 및 views::slide * views::chunk_by
## 2022년 7월
2022년 7월 25일 가상 WG21 회의 후, 다음 기능 및 결함 보고서가 추가되었으며 여론조사를 통해 승인되었다.url=https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/n4916.pdf * 표현식에서 동일성 재작성을 덜 파괴적인 변경으로 만들었다. * volatile 변수에 대한 비트별 할당 폐기 해제를 되돌렸다. * #warning 전처리기 지시어를 추가했다. * 인코딩 불가능한 와이드 문자 리터럴과 다중 문자 와이드 문자 리터럴을 제거했다. * 레이블이 복합 문의 끝에 나타날 수 있도록 허용했다. * 8진수 및 16진수에 대한 중괄호로 구분된 이스케이프 시퀀스와 유니버설 문자 이름을 추가했다. * constexpr 함수가 상수 표현식이 될 수 없도록 허용했다. * C++20의 일부 암시적 이동 규칙을 단순화하고 rvalue 참조를 반환할 때 암시적 이동을 허용했다. * 이름으로 유니코드 문자를 지정하는 방법을 추가했다. 예를 들어, U'\N{LATIN CAPITAL LETTER A WITH MACRON}' // Equivalent to U'\u0100' * cpp 및 람다가 cpp이 될 수 있도록 허용했다. * `this` 포인터와 알 수 없는 출처의 참조가 상수 표현식에 나타날 수 있도록 허용했다. * 세 가지 표준 부동 소수점 타입 외에 확장 부동 소수점 타입을 정의할 수 있도록 구현을 허용했다. 헤더 ``를 통해 접근 가능한 이러한 확장 타입에 대한 타입 별칭 `std::float16_t`, `std::float32_t`, `std::float64_t`, `std::float128_t`, `std::bfloat16_t`와 해당 리터럴 접미사 `f16` `f32` `f64` `f128` `bf16` 또는 `F16` `F32` `F64` `F128` `BF16`을 추가하고, float를 인수로 받는 다양한 표준 라이브러리 함수에 오버로드를 추가했다. * 컴파일러가 제공된 표현식이 참이라고 가정하여 최적화를 허용하는 assume(expression) 속성을 추가했다. * 소스 파일의 이동 가능한 인코딩을 제공하기 위해 UTF-8 소스 파일 지원을 의무화했다. * char 및 unsigned char 배열을 UTF-8 문자열 리터럴로 초기화할 수 있도록 허용했다. * 확장 문자 집합의 모든 문자를 인코딩할 수 있다는 cpp에 대한 요구 사항을 제거하여, UTF-16을 와이드 문자열 리터럴에 사용할 수 있도록 효과적으로 허용했다. * `std::span`과 유사한 다차원 배열 뷰인 `std::mdspan`을 추가했다. * flat_map 및 flat_set이 표준 라이브러리에 추가되었다. * 표준 출력에 서식 있는 텍스트를 출력하기 위한 std::print 및 std::println 함수를 추가했다. * 표준 라이브러리를 가져오기 위한 이름 있는 모듈 std 및 std.compat를 제공한다. * `fopen`의 "x" 플래그와 유사하게 독점 모드 `fstream`에 대한 지원을 추가했다. * `std::format`이 범위, 튜플 및 기타 컨테이너를 처리할 수 있도록 허용했다. * `std::forward_like`를 추가했다. * `std::string::substr`가 이동 시맨틱스를 사용하도록 만들었다. * std::ranges::input_range를 모델링하는 코루틴 생성자를 구현하는 std::generator를 추가했다. * views::cartesian_product, views::repeat, views::stride, views::as_const, views::as_rvalue. * 새로운 알고리즘 추가: ranges::find_last, ranges::contains 및 범위 폴드 알고리즘. * `std::tuple`을 다른 튜플 유사 객체와 호환 가능하게 만들었다. * 암시적 수명 타입에 대한 명시적 수명 관리. * `std::bitset` 및 `std::to_chars`와 `std::from_chars`의 정수 오버로드를 constexpr-호환 가능하게 만들었다. * 비교 개념에 대한 이동 전용 타입 지원 추가. * 비범위 알고리즘의 입력으로 범위 이터레이터. * 이동 전용 타입을 허용하도록 범위 어댑터 완화.
## 2022년 11월
2022년 11월 7일 하이브리드 WG21 회의 후, 다음 기능 및 결함 보고서가 추가되었으며 여론조사를 통해 승인되었다.url=https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/n4933.pdf * operator[]가 1=static이 될 수 있도록 허용했다. * 상수 표현식에서 사용 가능한 경우, 1=static 및 cpp 변수가 1=constexpr 함수에 나타날 수 있도록 허용했다. * cpp이 위로 전파되도록 했다. 즉, 특정 기존 constexpr 함수는 컴파일 시간에만 호출될 수 있는 경우 consteval 함수가 된다. * 범위 기반 for 루프의 for-range-initializer에 나타나는 임시 변수의 수명을 전체 루프를 포함하도록 연장했다. * (비트별이 아닌 모든) 복합 할당을 volatile 변수에 대한 폐기 해제를 되돌렸다. * std::expected에 대한 모나드 함수. * 네이티브 유니코드 API가 사용되는 경우 std::print의 출력을 기본 스트림과 동기화한다.author=Victor Zverovich
## 2023년 2월
2023년 2월 6일부터 11일까지 열린 최종 하이브리드 WG21 회의 후, 다음 기능 및 결함 보고서가 추가되었으며 여론조사를 통해 승인되었다.url=https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/n4943.pdf * 유니코드 표준 참조.author=Corentin Jabot * 적절한 평탄화를 위한 스태싱 이터레이터 스태싱.author1=Tim Song * `views::enumerate` * 뷰의 다중 매개변수 생성자를 명시적으로 만들기 * 범위를 약간 더 완화 * `std::format`의 이스케이프 개선 * `std::format`의 너비 추정 개선 * `std::format` 채움 문자 허용 * `thread::id` 및 `stacktrace` 포매팅 * 타입 트레잇 `std::is_implicit_lifetime` * `std::reference_wrapper`의 `std::common_reference_t`는 참조 타입이어야 한다. * `std::allocator_traits`의 사용자 특수화 금지 * `std::pmr::generator` * `std::numeric_limits::has_denorm` 폐기 * `std::barrier`의 페이즈 완료 보장