상위 질문
타임라인
채팅
관점
C++23
위키백과, 무료 백과사전
Remove ads
C++23, 공식적으로 ISO/IEC 14882:2024,[1]는 C++20에 이어지는 C++ 프로그래밍 언어의 현재 개방형 표준이다. 이 버전의 최종 초안은 N4950이다.[2][3]
2020년 2월, 프라하에서 열린 C++20 최종 회의에서 C++23에 대한 전체 계획이 채택되었다.[4][5] C++23의 계획된 기능은 코루틴을 위한 라이브러리 지원, 모듈화된 표준 라이브러리, 실행자(executor), 네트워킹이었다.
C++23에 초점을 맞춘 첫 WG21 회의는 2020년 6월 초 바르나에서 열릴 예정이었으나, 코로나19 범유행으로 인해 취소되었다.[6][7] 2020년 11월 뉴욕 회의[8][7]와 2021년 2월 코나(Kona) 회의[8]도 마찬가지였다. 2022년 11월까지 모든 회의는 가상으로 진행되었고, 2022년 11월 회의부터 2023년 2월 최종 회의까지는 하이브리드 형식으로 진행되었다.[8] 이 표준은 2023년 2월 이서콰에서 열린 하이브리드 회의에서 WG21에 의해 기술적으로 최종 확정되었다.[9]
Remove ads
현대적인 "Hello, world" 예제
작업 초안에 많은 라이브러리 변경 사항이 적용된 후, 새로운 "Hello, world" 프로그램은 다음과 같다.
import std;
int main() {
std::println("Hello, world!");
}
기능
요약
관점
C++23에 승인된 변경 사항은 다음과 같다.
언어
- 명시적
this객체 매개변수[10] if consteval[11]- 다차원 첨자 연산자[12]
- 정적 호출 및 첨자 연산자와 정적 람다[13][14]
- 암시적 이동 단순화[15]
auto(x)및auto{x}[16]- 새로운 전처리기 지시문:
- 범위 기반 for 루프에서 일부 임시 변수의 수명 연장[19]
- 새로운 표준 속성
[[assume(expression)]][20] - 상속된 생성자로부터의 클래스 템플릿 인자 추론[21]
- 복합 문의 끝에 있는 레이블[22]
- 초기화 문 내의 별칭 선언[23]
std::size_t및 해당 부호 있는 타입에 대한 리터럴 접미사[24]- 리터럴을 포함한 확장 부동 소수점 타입 (조건부 지원)[25]
- 널리 람다 표현식의 선택적
()[26] - 람다 표현식의 속성[27]
constexpr변경 사항:static_assert및if constexpr에서bool로의 컨텍스트적 축소 변환[31]- 라인 연결 전 공백 제거[32]
- 선언 순서 레이아웃 의무화[33]
- 구분된 이스케이프 시퀀스[34]
- 이름 있는 유니버설 문자 이스케이프[35]
- 텍스트 인코딩 변경 사항:
this와 같은 일부 키워드에 새로운 의미 추가..[39]
라이브러리
표준 라이브러리 모듈 지원
- 표준 라이브러리 모듈
std및std.compat[40]
코루틴 라이브러리 지원
- 범위에 대한 동기식 코루틴
std::generator[41]
일반 유틸리티 지원
- 결과 타입
std::expected[42] std::optional[43] 및std::expected[44]을 위한 모나드 연산- enum의 기본 값을 가져오는 유틸리티 함수
std::to_underlying[45] - 이동 전용 호출 가능 래퍼
std::move_only_function[46] std::forward_like[47]std::invoke_r[48]std::bind_back[49]std::byteswap[50]std::unreachable: 접근할 수 없는 코드를 표시하는 함수[51]std::tuple을 다른 튜플 유사 객체와 호환 가능하게 만들었다.[52]- 참조 타입을 반환하는
std::reference_wrapper에 대한std::basic_common_reference특수화 추가[53] std::pair의 전달 생성자에 대한 기본 인자 추가[54]
컴파일 시간 지원
constexpr지원:- 메타프로그래밍 유틸리티:
- 비교 개념에 대한 이동 전용 타입 지원 추가[63]
이터레이터, 범위 및 알고리즘 지원
- 새로운 범위 변환 함수
std::ranges::to[64] - 새로운 제약이 있는 범위 알고리즘:
- 새로운
std::ranges::range_adaptor_closure, 사용자 정의 범위 어댑터 클로저를 정의하기 위한 헬퍼[49] - 새로운 범위 어댑터:
std::views::zip및 기타 변형std::views::adjacent및 기타 변형[70]std::views::join_with[71]std::views::slidestd::views::chunk[72]std::views::chunk_by[73]std::views::as_rvalue[74]std::views::as_const[75]std::views::repeat[76]std::views::stride[77]std::views::cartesian_product[78]std::views::enumerate[79]
- 상수 이터레이터, 센티넬 및 범위를 수정하여
std::ranges::cbegin및 기타 유사 유틸리티가 얕은 상수 뷰(예:std::span)의 경우에도 상수 이터레이터를 반환하도록 완전히 보장한다.[75] - 비범위 알고리즘의 입력으로 범위 이터레이터[80]
- 이동 전용 타입을 허용하도록 범위 어댑터 완화[81]
- 일부 뷰의 다중 매개변수 생성자를
explicit으로 만들었다.[82]
메모리 관리 지원
문자열 및 텍스트 처리 지원
진단 지원
- 스택 트레이스 라이브러리[95]
I/O 지원
컨테이너 지원
C 호환성 지원
- 새로운 헤더
<stdatomic.h>[110]
언어 결함 보고서
- 유니코드 표준 부록 31을 사용하는 C++ 식별자 구문[111]
- 중복 속성 허용[112]
- 람다 후행 반환 타입의 범위 변경[113]
- 오버로드된 비교 연산자를 덜 파괴적인 변경으로 만들기[114]
- Volatile 복합 할당의 폐기 해제[115][116]
char8_t의 호환성 및 이식성 문제 해결[117]- 기존 관행에 맞춰
wchar_t에 대한 요구 사항 완화[118] - 상수 표현식에서
this또는 알 수 없는 출처의 일부 포인터 및 참조 허용[119] - 즉시 확장 함수를 즉시 함수로 승격[120]
- 인스턴스화되지 않은 템플릿 컨텍스트에서
static_assert(false)허용
라이브러리 결함 보고서
- 범위 라이브러리의 변경 사항:
- 조건부로 빌려온 범위[121]
- 입력 범위 어댑터 및
std::counted_iterator수정[122] std::ranges::join_view에 대한 제약 완화[123]std::ranges::split_view를std::ranges::lazy_split_view로 이름 변경 및 새로운split_view[124]- 개념
std::ranges::view에서std::default_initializable제약 조건 제거[125] - 소유권을 가진 뷰와 새로운
std::ranges::owning_view[126] std::ranges::istream_view수정[127]
- 텍스트 포매팅 라이브러리 변경 사항:
- 완전히
constexpr인std::variant및std::optional[134] std::visit에서std::variant에서 파생된 타입 지원[135]
제거된 기능 및 폐기
제거된 기능:
- 가비지 컬렉션 지원 및 (엄격한) 포인터 안전성[136] (즉, 완화된 포인터 안전성만 의존 가능[137]). 이 최소한의 가비지 컬렉션 지원(및 이를 위해 필요한 포인터 안전성)은 C++11에 추가되었지만, 어떤 컴파일러도 이를 지원한 적이 없으므로 C++23에서 제거되었다.[138] 그러나 이것이 Boehm GC와 같이 C++와 함께 많은 GC 구현이 사용되지 않았다는 것을 의미하지는 않으며, 디버그 모드에서 누수 감지를 위해 (또한 누수 감지에도) 사용될 수 있으며, 이러한 GC는 다른 언어에서 사용하기 위해 종종 C++로 구현된다.
- 혼합 와이드 문자열 리터럴 연결.[139]
- 인코딩 불가능한 와이드 문자 리터럴 및 다중 문자 와이드 문자 리터럴.[140]
폐기된 기능:
복원된 폐기된 기능:
- 첨자 표현식에서 쉼표 연산자 사용은 더 이상 폐기되지 않았지만, 오버로드 가능한 n-adic
operator[]를 지원하도록 의미가 변경되었다. - C 헤더 (C와의 호환성을 위한 해당
<*.h>헤더)
Remove ads
기술 사양으로 발행됨
- Concurrency TS v2[143]
컴파일러 지원
역사
요약
관점
대면 WG21 회의가 없는 상황에서, 다음 변경 사항들은 여러 가상 WG21 회의 후 적용되었으며, 여기서 여론조사(straw poll)를 통해 승인되었다.
2020년 11월
2020년 11월 9일 가상 WG21 회의 후 다음 사항들이 추가되었으며, 여론조사를 통해 승인되었다.[146]
2021년 2월
2021년 2월 22일 가상 WG21 회의 후, 다음 기능들이 추가되었으며 여론조사를 통해 승인되었다.[147]
2021년 6월
2021년 6월에 열린 여름 ISO C++ 표준 본회의 가상 회의 후, 새로운 기능과 결함 보고서가 여론조사를 통해 승인되었다.[150]
- Consteval if (
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년 10월에 열린 2021년 가을 ISO C++ 표준 본회의 가상 회의 후, 새로운 기능과 결함 보고서가 여론조사를 통해 승인되었다.[151]
- 비리터럴 변수, 레이블 및
goto가constexpr함수에 허용되었지만, 컴파일 시간에 평가하는 것은 여전히 잘못된 형식이다. - 명시적
this객체 매개변수. - 문자 집합 및 인코딩 변경 사항.
- 새로운 전처리기:
#elifdef및#elifndef. 두 지시문은 C23 (C 언어 업데이트) 및 GCC 12에 추가되었다.[152] - 초기화 문에서 별칭 선언 허용.
- 다차원 첨자 연산자 오버로드 (예:
arr[1, 2]). - 언어 내 decay copy:
auto(x)또는autox}. - 텍스트 포매팅 라이브러리 변경 사항:
- chrono 포매터에서 로케일 처리 문제 해결.
std::generator유사 타입을 허용하기 위해 형식 인자에서 전달 참조 사용.
std::pmr::polymorphic_allocator와 동등한 타입 별칭std::pmr::stacktrace추가.[153]- 범위 라이브러리 변경 사항:
- 뷰의 정제된 정의.
- 함수 템플릿
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사양 추가.[154]- 정수 클래스 타입의 사양 및 사용 개편.[155]
- C 헤더 명확화. "헤더는 C++로만 유효해야 하는 코드에서는 유용하지 않다. 따라서 C 헤더는 C++ 표준 라이브러리에서 완전히 지원되고 폐기되지 않은 부분으로 제공되어야 하지만, 다국어 상호 운용 코드(polyglot interoperability code)가 아닌 코드에서는 사용이 권장되지 않는다. [..] 이 제안은 C 헤더를 더 이상 폐기되지 않도록 하여 향후 제거될 formal threat를 없앤다. 순수 C++ 코드에서 C 헤더 사용을 자제하도록 하는 실질적인 권장 사항은 이제 규범적 권장 사항으로 명시적으로 명시된다."[156]
2022년 2월
2022년 2월 7일 가상 WG21 회의 후, 다음 기능들이 추가되었으며 여론조사를 통해 승인되었다.[157]
- 람다의 함수 호출 연산자에 속성 허용
std::expectedcmath및cstdlib에 대한constexpr- 접근할 수 없는 코드를 표시하는 함수
ranges::to- 임시 객체에 대한 참조 바인딩을 감지하는 타입 트레잇
std::unique_ptr를constexpr로 만들기- 사용자 정의 범위 어댑터에 대한 파이프 지원
ranges::iota,ranges::shift_left및ranges::shift_rightviews::join_with- 윈도잉 범위 어댑터:
views::chunk및views::slide views::chunk_by
2022년 7월
2022년 7월 25일 가상 WG21 회의 후, 다음 기능 및 결함 보고서가 추가되었으며 여론조사를 통해 승인되었다.[158]
- 표현식에서 동일성 재작성을 덜 파괴적인 변경으로 만들었다.
volatile변수에 대한 비트별 할당 폐기 해제를 되돌렸다.#warning전처리기 지시어를 추가했다.- 인코딩 불가능한 와이드 문자 리터럴과 다중 문자 와이드 문자 리터럴을 제거했다.
- 레이블이 복합 문의 끝에 나타날 수 있도록 허용했다.
- 8진수 및 16진수에 대한 중괄호로 구분된 이스케이프 시퀀스와 유니버설 문자 이름을 추가했다.
constexpr함수가 상수 표현식이 될 수 없도록 허용했다.- C++20의 일부 암시적 이동 규칙을 단순화하고 rvalue 참조를 반환할 때 암시적 이동을 허용했다.
- 이름으로 유니코드 문자를 지정하는 방법을 추가했다. 예를 들어,
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와 해당 리터럴 접미사f16f32f64f128bf16또는F16F32F64F128BF16을 추가하고, float를 인수로 받는 다양한 표준 라이브러리 함수에 오버로드를 추가했다. - 컴파일러가 제공된 표현식이 참이라고 가정하여 최적화를 허용하는
[[assume(expression)]]속성을 추가했다. - 소스 파일의 이동 가능한 인코딩을 제공하기 위해 UTF-8 소스 파일 지원을 의무화했다.
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월
2022년 11월 7일 하이브리드 WG21 회의 후, 다음 기능 및 결함 보고서가 추가되었으며 여론조사를 통해 승인되었다.[159]
operator[]가static이 될 수 있도록 허용했다.- 상수 표현식에서 사용 가능한 경우,
static및thread_local변수가constexpr함수에 나타날 수 있도록 허용했다. consteval이 위로 전파되도록 했다. 즉, 특정 기존constexpr함수는 컴파일 시간에만 호출될 수 있는 경우consteval함수가 된다.- 범위 기반
for루프의 for-range-initializer에 나타나는 임시 변수의 수명을 전체 루프를 포함하도록 연장했다. - (비트별이 아닌 모든) 복합 할당을
volatile변수에 대한 폐기 해제를 되돌렸다. std::expected에 대한 모나드 함수.- 네이티브 유니코드 API가 사용되는 경우
std::print의 출력을 기본 스트림과 동기화한다.[160]
2023년 2월
2023년 2월 6일부터 11일까지 열린 최종 하이브리드 WG21 회의 후, 다음 기능 및 결함 보고서가 추가되었으며 여론조사를 통해 승인되었다.[161]
- 유니코드 표준 참조.[162]
- 적절한 평탄화를 위한 스태싱 이터레이터 스태싱.[163]
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::generatorstd::numeric_limits::has_denorm폐기std::barrier의 페이즈 완료 보장
Remove ads
같이 보기
각주
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads