| C++ 언어 버전 |
|---|
| C++98 • C++03 • C++11 • C++14 • C++17 • C++20 • C++23 |
C++23, 공식적으로 ISO/IEC 14882:2024,는 C++20에 이어지는 C++ 프로그래밍 언어의 현재 개방형 표준이다. 이 버전의 최종 초안은 N4950이다.
2020년 2월, 프라하에서 열린 C++20 최종 회의에서 C++23에 대한 전체 계획이 채택되었다. C++23의 계획된 기능은 코루틴을 위한 라이브러리 지원, 모듈화된 표준 라이브러리, 실행자(executor), 네트워킹이었다.
C++23에 초점을 맞춘 첫 WG21 회의는 2020년 6월 초 바르나에서 열릴 예정이었으나, 코로나19 범유행으로 인해 취소되었다. 2020년 11월 뉴욕 회의와 2021년 2월 코나(Kona) 회의도 마찬가지였다. 2022년 11월까지 모든 회의는 가상으로 진행되었고, 2022년 11월 회의부터 2023년 2월 최종 회의까지는 하이브리드 형식으로 진행되었다. 이 표준은 2023년 2월 이서콰에서 열린 하이브리드 회의에서 WG21에 의해 기술적으로 최종 확정되었다.
작업 초안에 많은 라이브러리 변경 사항이 적용된 후, 새로운 "Hello, world" 프로그램은 다음과 같다.
import std;
int main() {
std::println("Hello, world!");
}
C++23에 승인된 변경 사항은 다음과 같다.
this 객체 매개변수if constevalauto(x) 및 auto{x}#elifdef 및 #elifndef#warning[[assume(expression)]]std::size_t 및 해당 부호 있는 타입에 대한 리터럴 접미사()constexpr 변경 사항:
constexpr 함수 내의 비리터럴 변수, 레이블 및 gotoconstexpr 함수 내에서 상수 표현식으로 사용 가능한 static 및 thread_local 변수 허용constexpr 함수는 반환 타입과 매개변수 타입이 리터럴 타입일 필요가 없다.constexpr 함수를 작성하는 것이 이제 가능하다.static_assert 및 if constexpr에서 bool로의 컨텍스트적 축소 변환this와 같은 일부 키워드에 새로운 의미 추가..std 및 std.compatstd::generatorstd::expectedstd::optional 및 std::expected을 위한 모나드 연산std::to_underlyingstd::move_only_functionstd::forward_likestd::invoke_rstd::bind_backstd::byteswapstd::unreachable: 접근할 수 없는 코드를 표시하는 함수std::tuple을 다른 튜플 유사 객체와 호환 가능하게 만들었다.std::reference_wrapper에 대한 std::basic_common_reference 특수화 추가std::pair의 전달 생성자에 대한 기본 인자 추가constexpr 지원:
std::type_info::operator==std::bitsetstd::unique_ptr<cmath> 함수std::to_chars 및 std::from_chars의 정수 오버로드std::is_scoped_enum, std::is_implicit_lifetime, std::reference_constructs_from_temporary, 및 std::reference_converts_from_temporary.std::ranges::tostd::ranges::starts_withstd::ranges::ends_withstd::ranges::containsstd::ranges::contains_subrangestd::ranges::find_last 및 기타 변형iota, shift_left 및 shift_right의 범위화된 버전std::ranges::range_adaptor_closure, 사용자 정의 범위 어댑터 클로저를 정의하기 위한 헬퍼std::views::zip 및 기타 변형std::views::adjacent 및 기타 변형std::views::join_withstd::views::slidestd::views::chunkstd::views::chunk_bystd::views::as_rvaluestd::views::as_conststd::views::repeatstd::views::stridestd::views::cartesian_productstd::views::enumeratestd::ranges::cbegin 및 기타 유사 유틸리티가 얕은 상수 뷰(예: std::span)의 경우에도 상수 이터레이터를 반환하도록 완전히 보장한다.explicit으로 만들었다.std::out_ptr 및 std::inout_ptrstd::allocate_at_least 및 std::allocator::allocate_at_leaststd::start_lifetime_asstd::allocator_traits의 사용자 특수화 금지std::basic_string_view::contains 및 std::basic_string::containsstd::basic_string 및 std::basic_string_view에 대한 nullptr로부터의 생성 비활성화std::basic_string_view에 대한 명시적 범위 생성자std::basic_string::resize_and_overwritestd::basic_string::substr의 rvalue 참조 오버로드std::thread::id 및 스택 트레이스 포매팅.<print>에서 가져온 서식 있는 출력 함수 std::print 및 std::println<spanstream>에서 가져온 spanstream 라이브러리(std::span 기반 문자열 스트림)std::fstream에서 독점 모드 지원std::basic_ostream::operator<<(const volatile void*)std::mdspanstd::span 및 std::basic_string_view가 사소하게 복사 가능해야 함을 요구<stdatomic.h>char8_t의 호환성 및 이식성 문제 해결wchar_t에 대한 요구 사항 완화this 또는 알 수 없는 출처의 일부 포인터 및 참조 허용static_assert(false) 허용std::counted_iterator 수정std::ranges::join_view에 대한 제약 완화std::ranges::split_view를 std::ranges::lazy_split_view로 이름 변경 및 새로운 split_viewstd::ranges::view에서 std::default_initializable 제약 조건 제거std::ranges::owning_viewstd::ranges::istream_view 수정std::basic_format_stringstd::format_to의 이진 코드 크기 감소std::format의 채움 문자 허용constexpr인 std::variant 및 std::optionalstd::visit에서 std::variant에서 파생된 타입 지원제거된 기능:
폐기된 기능:
std::aligned_storage 및 std::aligned_unionstd::numeric_limits::has_denorm복원된 폐기된 기능:
operator[]를 지원하도록 의미가 변경되었다.<*.h> 헤더)대면 WG21 회의가 없는 상황에서, 다음 변경 사항들은 여러 가상 WG21 회의 후 적용되었으며, 여기서 여론조사(straw poll)를 통해 승인되었다.
2020년 11월 9일 가상 WG21 회의 후 다음 사항들이 추가되었으며, 여론조사를 통해 승인되었다.
2021년 2월 22일 가상 WG21 회의 후, 다음 기능들이 추가되었으며 여론조사를 통해 승인되었다.
() 제거.counted_iterator 수정.time_point::clock에 대한 요구 사항 완화.std::variant에서 파생된 클래스에 대한 std::visit.std::to_underlying.2021년 6월에 열린 여름 ISO C++ 표준 본회의 가상 회의 후, 새로운 기능과 결함 보고서가 여론조사를 통해 승인되었다.
if consteval).bool로의 컨텍스트적 축소 변환.std::span 기반 문자열 스트림 (<spanstream>).std::out_ptr() 및 std::inout_ptr().std::optional, std::variant 및 std::type_info::operator==에 대한 constexpr.std::stack (스택) 및 std::queue (큐)에 대한 이터레이터 쌍 생성자.starts_with 및 ends_with.split_view를 lazy_split_view로 이름 변경 및 새로운 split_view.join_view에 대한 제약 완화.view에서 default_initializable 제약 조건 제거.std::basic_string_view에 대한 범위 생성자.nullptr로부터의 std::basic_string 및 std::basic_string_view 생성 금지.std::invoke_r.std::format 개선.std::pair의 전달 생성자에 기본 인자 추가.2021년 10월에 열린 2021년 가을 ISO C++ 표준 본회의 가상 회의 후, 새로운 기능과 결함 보고서가 여론조사를 통해 승인되었다.
goto가 constexpr 함수에 허용되었지만, 컴파일 시간에 평가하는 것은 여전히 잘못된 형식이다.this 객체 매개변수.#elifdef 및 #elifndef. 두 지시문은 C23 (C 언어 업데이트) 및 GCC 12에 추가되었다.arr[1, 2]).auto(x) 또는 auto{x}.std::generator 유사 타입을 허용하기 위해 형식 인자에서 전달 참조 사용.std::pmr::polymorphic_allocator와 동등한 타입 별칭 std::pmr::stacktrace 추가.std::ranges::istream_view를 별칭 템플릿 std::ranges::istream_view, std::ranges::wistream_view 및 사용자 정의 지점 객체 std::views::istream으로 대체.zip 범위 어댑터 패밀리:
zip_viewzip_transform_viewadjacent_view (및 std::views::pairwise는 std::views::adjacent<2>와 동등)adjacent_transform_view (및 std::views::pairwise_transform는 std::views::adjacent_transform<2>와 동등)std::move_only_function.std::optional에 대한 모나드 연산.std::basic_string::resize_and_overwrite.volatile 포인터 출력 (volatile T*).std::byteswap.std::span 및 std::basic_string_view의 모든 특수화는 사소하게 복사 가능하다.std::exchange에 조건부 noexcept 사양 추가.2022년 2월 7일 가상 WG21 회의 후, 다음 기능들이 추가되었으며 여론조사를 통해 승인되었다.
std::expectedcmath 및 cstdlib에 대한 constexprranges::tostd::unique_ptr를 constexpr로 만들기ranges::iota, ranges::shift_left 및 ranges::shift_rightviews::join_withviews::chunk 및 views::slideviews::chunk_by2022년 7월 25일 가상 WG21 회의 후, 다음 기능 및 결함 보고서가 추가되었으며 여론조사를 통해 승인되었다.
volatile 변수에 대한 비트별 할당 폐기 해제를 되돌렸다.#warning 전처리기 지시어를 추가했다.constexpr 함수가 상수 표현식이 될 수 없도록 허용했다.U'\N{LATIN CAPITAL LETTER A WITH MACRON}' // Equivalent to U'\u0100'operator() 및 람다가 static이 될 수 있도록 허용했다.this 포인터와 알 수 없는 출처의 참조가 상수 표현식에 나타날 수 있도록 허용했다.<stdfloat>를 통해 접근 가능한 이러한 확장 타입에 대한 타입 별칭 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)]] 속성을 추가했다.char 및 unsigned char 배열을 UTF-8 문자열 리터럴로 초기화할 수 있도록 허용했다.wchar_t에 대한 요구 사항을 제거하여, 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월 7일 하이브리드 WG21 회의 후, 다음 기능 및 결함 보고서가 추가되었으며 여론조사를 통해 승인되었다.
operator[]가 static이 될 수 있도록 허용했다.static 및 thread_local 변수가 constexpr 함수에 나타날 수 있도록 허용했다.consteval이 위로 전파되도록 했다. 즉, 특정 기존 constexpr 함수는 컴파일 시간에만 호출될 수 있는 경우 consteval 함수가 된다.for 루프의 for-range-initializer에 나타나는 임시 변수의 수명을 전체 루프를 포함하도록 연장했다.volatile 변수에 대한 폐기 해제를 되돌렸다.std::expected에 대한 모나드 함수.std::print의 출력을 기본 스트림과 동기화한다.2023년 2월 6일부터 11일까지 열린 최종 하이브리드 WG21 회의 후, 다음 기능 및 결함 보고서가 추가되었으며 여론조사를 통해 승인되었다.
views::enumeratestd::format의 이스케이프 개선std::format의 너비 추정 개선std::format 채움 문자 허용thread::id 및 stacktrace 포매팅std::is_implicit_lifetimestd::reference_wrapper의 std::common_reference_t는 참조 타입이어야 한다.std::allocator_traits의 사용자 특수화 금지std::pmr::generatorstd::numeric_limits::has_denorm 폐기std::barrier의 페이즈 완료 보장static constexpr variables in constexpr functions”. 2022년 11월 7일.std::expected”.mdspan: rename pointer and contiguous”. 2022년 6월 15일.empty to mdspan”.char8_t Compatibility and Portability Fix”. 2022년 6월 17일.wchar_t to match existing practices” (PDF). 2022년 7월 15일.consteval needs to propagate up”. 2022년 11월 11일.