Namespaces
Variants

C++ Standard Library

From cppreference.net

C++ 표준 라이브러리는 표준 C++에서 사용 가능한 다양한 기능들을 제공합니다.

목차

카테고리

언어 지원 라이브러리 는 메모리 할당 ( new / delete ) 및 예외 처리 와 같은 C++ 언어의 특정 부분에서 요구되는 구성 요소들을 제공합니다.

concepts 라이브러리 는 C++ 프로그램이 템플릿 인자 의 컴파일 타임 검증을 수행하고 타입의 속성에 기반한 함수 디스패치를 수행하기 위해 사용할 수 있는 라이브러리 구성 요소들을 설명합니다.

(C++20부터)

진단 라이브러리 는 C++ 프로그램에서 오류를 보고하기 위한 일관된 프레임워크를 제공하며, 미리 정의된 예외 클래스들 을 포함합니다.

메모리 관리 라이브러리 는 메모리 관리를 위한 구성 요소들을 제공하며, 여기에는 스마트 포인터 스코프 할당자 (C++11부터) 가 포함됩니다.

메타프로그래밍 라이브러리 템플릿 내부와 상수 평가 중에 사용하기 위한 기능들을 설명하며, 여기에는 타입 트레이트 , 정수 시퀀스 , (C++14부터) 그리고 유리수 연산 이 포함됩니다.

(C++11부터)

범용 유틸리티 라이브러리 는 동적 저장소 관리를 위한 미리 정의된 저장소 할당자 와 같은 다른 라이브러리 구성 요소들이 사용하는 구성 요소들과, C++ 프로그램에서 기반 구조로 사용되는 튜플 (C++11부터) 함수 래퍼 와 같은 구성 요소들을 포함합니다.

컨테이너 , 반복자 , 레인지 (C++20 이후) , 그리고 알고리즘 라이브러리는 C++ 프로그램에 가장 널리 사용되는 알고리즘과 데이터 구조의 하위 집합에 대한 접근을 제공합니다.

문자열 라이브러리 는 다음과 같은 타입들의 동종 시퀀스로 표현된 텍스트 조작을 지원합니다: char , char8_t (C++20부터) , char16_t , char32_t (C++11부터) , wchar_t , 그리고 기타 모든 문자형 타입들.

텍스트 처리 라이브러리 정규 표현식 매칭 및 검색 (C++11부터) , 텍스트 포맷팅 유틸리티 (C++20부터) , 텍스트 인코딩 식별 (C++26부터) 그리고 지역화 기능 을 제공합니다.

수치 라이브러리 는 숫자 처리 지원을 확장하는 수치 알고리즘 복소수 구성 요소를 제공합니다. valarray 구성 요소는 n개씩 한 번에 처리하는 지원을 제공하며, 이러한 처리를 지원하는 플랫폼에서 병렬 연산으로 구현될 수 있습니다. 난수 구성 요소 는 의사 난수 생성 기능을 제공합니다. (C++11부터)

time library 는 일반적으로 유용한 시간 유틸리티를 제공합니다.

입출력 라이브러리 는 C++ 프로그램 입력 및 출력의 주요 메커니즘인 iostream 구성 요소 를 제공합니다. 이들은 라이브러리의 다른 요소, 특히 문자열, 로케일 및 반복자와 함께 사용될 수 있습니다.

스레드 지원 라이브러리 는 스레드를 생성하고 관리하기 위한 구성 요소를 제공하며, atomic operations , mutual exclusion , 그리고 스레드 간 통신을 포함합니다.

(since C++11)

실행 지원 라이브러리는 일반적인 실행 리소스에서 비동기 실행을 관리하기 위한 프레임워크를 제공합니다.

(C++26부터)

라이브러리 내용

C++ 표준 라이브러리는 entities macros 에 대한 정의를 C++ standard library headers 의 개요에 설명된 대로 제공하며, 별도로 명시되지 않는 한 이를 따릅니다.

operator new operator delete 를 제외한 모든 라이브러리 개체는 std 네임스페이스 내부 또는 std 네임스페이스 내부에 중첩된 네임스페이스 내에 정의됩니다 (C 표준 라이브러리 기능에 대한 개체는 아래 참조). 특정 네임스페이스에서 선언된 이름이 해당 네임스페이스에 직접 선언되는지, 아니면 그 네임스페이스 내부의 인라인 네임스페이스 에 선언되는지는 명시되지 않습니다. (C++11부터)

헤더

C++ 표준 라이브러리의 각 요소는 적절한 헤더 에 선언되거나 정의됩니다. 헤더가 반드시 소스 파일일 필요는 없으며, 헤더 이름에서 < > 로 구분된 시퀀스가 유효한 소스 파일 이름일 필요도 없습니다.

C++ 표준 라이브러리는 C++ 라이브러리 헤더 C 라이브러리 기능을 위한 추가 C++ 헤더 를 제공합니다 (설명은 " headers " 페이지 참조):

**변역 결과:** - HTML 태그와 속성은 그대로 유지됨 - ` `, `
`, `` 태그 내부 텍스트는 번역되지 않음 (이 경우 `` 태그 내부)
- C++ 관련 용어(``, ``)는 번역되지 않음
- HTML 구조와 서식이 완벽하게 보존됨
이 웹페이지의 내용은 C++ 헤더 파일 목록을 나타내는 테이블 행으로, 번역이 필요한 텍스트가 없습니다.
C++ 라이브러리 헤더
<algorithm> <iomanip> <list> <ostream> <streambuf>
<bitset> <ios> <locale> <queue> <string>
<complex> <iosfwd> <map> <set> <typeinfo>
<deque> <iostream> <memory> <sstream> <utility>
<exception> <istream> <new> <stack> <valarray>
<fstream> <iterator> <numeric> <stdexcept> <vector>
<functional> <limits>
C++11에서 추가된 헤더
<array> <condition_variable> <mutex> <scoped_allocator> <type_traits>
<atomic> <forward_list> <random> <system_error> <typeindex>
<chrono> <future> <ratio> <thread> <unordered_map>
<codecvt> <initializer_list> <regex> <tuple> <unordered_set>
C++14에서 추가된 헤더
<shared_mutex>
C++17에서 추가된 헤더
<any> <execution> <memory_resource> <string_view> <variant>
<charconv> <filesystem> <optional>
C++20에서 추가된 헤더
<barrier> <concepts> <latch> <semaphore> <stop_token>
<bit> <coroutine> <numbers> <source_location> <syncstream>
<compare> <format> <ranges> <span> <version>
C++23에서 추가된 헤더
<expected> <flat_set> <mdspan> <spanstream> <stdfloat>
<flat_map> <generator> <print> <stacktrace>
C++26에서 추가된 헤더
<contracts> <hazard_pointer> <inplace_vector> <rcu> <text_encoding>
<debugging> <hive> <linalg> <simd>
제거된 헤더
<codecvt> (C++11부터) (C++17에서 사용 중단됨) (C++26에서 제거됨)
<strstream> (C++98에서 사용 중단됨) (C++26에서 제거됨)
C 라이브러리 기능을 위한 C++ 헤더
<cassert> <clocale> <cstdarg> <cstring>
<cctype> <cmath> <cstddef> <ctime>
<cerrno> <csetjmp> <cstdio> <cwchar>
<cfloat> <csignal> <cstdlib> <cwctype>
<climits>
C++11에서 추가된 헤더
<cfenv> <cinttypes> <cstdint> <cuchar>
제거된 헤더
<ccomplex> (C++11부터) (C++17에서 사용 중단됨) (C++20에서 제거됨)
<ciso646> (C++20에서 제거됨)
<cstdalign> (C++11부터) (C++17에서 사용 중단됨) (C++20에서 제거됨)
<cstdbool> (C++11부터) (C++17에서 사용 중단됨) (C++20에서 제거됨)
<ctgmath> (C++11부터) (C++17에서 사용 중단됨) (C++20에서 제거됨)

독립형 구현 은 구현에서 정의된 헤더 집합을 가지며, 헤더 집합에 대한 최소 요구사항은 여기 를 참조하십시오.

C 표준 라이브러리

C++ 표준 라이브러리는 또한 C 표준 라이브러리의 기능들을 정적 타입 안전성을 보장하도록 적절히 조정하여 제공합니다. 많은 라이브러리 함수들의 설명은 해당 함수들의 의미론(semantics)에 대해 C 표준 라이브러리에 의존합니다.

일부 경우에는 표준 C++에 명시된 시그니처가 C 표준 라이브러리의 시그니처와 다를 수 있으며, 추가적인 오버로드가 선언될 수 있지만, 달리 명시되지 않는 한 동작과 사전 조건 (C의 restrict 에 의해 암시되는 것들을 포함하여) (C++17부터) 은 동일합니다.

C++ 표준 라이브러리는 C 표준 라이브러리와의 호환성을 위해 아래에 열거된 C 헤더들을 제공합니다. 이러한 헤더들의 사용 목적은 상호 운용성에만 한정됩니다. 유효한 ISO C가 되기 위해 C++ 소스 파일이 이러한 헤더들 중 하나를 포함해야 할 수 있습니다. 동시에 유효한 ISO C가 될 의도가 없는 소스 파일들은 C 헤더들 중 어떤 것도 사용해서는 안 됩니다. 설명은 여기 를 참조하십시오.

C 헤더
<assert.h> <limits.h> <stdarg.h> <string.h>
<ctype.h> <locale.h> <stddef.h> <time.h>
<errno.h> <math.h> <stdio.h> <wchar.h>
<float.h> <setjmp.h> <stdlib.h> <wctype.h>
<iso646.h> <signal.h>
C++11에서 추가된 헤더
<complex.h> <inttypes.h> <stdbool.h> <tgmath.h>
<fenv.h> <stdalign.h> <stdint.h> <uchar.h>
C++23에서 추가된 헤더
<stdatomic.h>
C++26에서 추가된 헤더
<stdbit.h> <stdchkint.h>

달리 명시되지 않는 한, 각 헤더 c xxx 의 내용은 C 표준 라이브러리 에 명시된 해당 헤더 xxx .h 와 동일합니다. 그러나 C++ 표준 라이브러리에서는 선언들(C에서 매크로로 정의된 이름들을 제외)이 std 네임스페이스의 범위 내에 있습니다. 이러한 이름들(추가된 오버로드 포함)이 먼저 전역 네임스페이스 범위에서 선언된 후 std 네임스페이스로 명시적 using-declarations 에 의해 주입되는지는 명시되지 않습니다.

C에서 매크로로 정의된 이름들( assert , offsetof , setjmp , va_arg , va_end va_start )은 C에서 함수로 구현할 수 있는 허가를 부여하더라도 C++ 표준 라이브러리에서 반드시 매크로로 정의되어야 합니다.

C에서 함수로 정의된 이름들은 C++ 표준 라이브러리에서도 함수로 정의되어야 합니다. 이는 C에서 허용되었던 함수 프로토타입에 추가로 마스킹 매크로를 제공하는 관행을 금지합니다. C++에서 동등한 인라인 동작을 달성하는 유일한 방법은 extern inline function 으로 정의를 제공하는 것입니다.

C++에서 키워드나 연산자인 식별자는 C++ 표준 라이브러리 헤더에서 매크로로 정의될 수 없습니다. 특히, 표준 헤더 <iso646.h> 를 포함하는 것은 아무런 효과가 없습니다.

표준 C의 안전 함수와 관련된 이름들 (C++17부터)

C++ 헤더가 포함된 경우, 다음 C 표준 Annex K 이름 중 어느 것이라도 전역 네임스페이스에 선언되는지는 구현에 따라 정의됩니다(이들 중 어느 것도 std 네임스페이스에 선언되지 않음):

C 표준 부록 K 이름
abort_handler_s mbstowcs_s strncat_s vswscanf_s
asctime_s memcpy_s strncpy_s vwprintf_s
bsearch_s memmove_s strtok_s vwscanf_s
constraint_handler_t memset_s swprintf_s wcrtomb_s
ctime_s printf_s swscanf_s wcscat_s
errno_t qsort_s tmpfile_s wcscpy_s
fopen_s RSIZE_MAX TMP_MAX_S wcsncat_s
fprintf_s rsize_t tmpnam_s wcsncpy_s
freopen_s scanf_s vfprintf_s wcsnlen_s
fscanf_s set_constraint_handler_s vfscanf_s wcsrtombs_s
fwprintf_s snprintf_s vfwprintf_s wcstok_s
fwscanf_s snwprintf_s vfwscanf_s wcstombs_s
gets_s sscanf_s vprintf_s wmemcpy_s
gmtime_s mbstowcs_s vscanf_s vswscanf_s
abort_handler_s strcat_s vsnprintf_s wmemmove
ignore_handler_s strcpy_s vsnwprintf_s wprintf_s
localtime_s strerrorlen_s vsprintf_s wscanf_s
L_tmpnam_s strerror_s vsscanf_s
mbsrtowcs_s strlen_s vswprintf_s

라이브러리 사용하기

헤더 포함하기

C++ 표준 라이브러리의 엔티티들은 헤더에 정의되어 있으며, 해당 헤더의 내용은 번역 단위가 적절한 #include 전처리 지시자를 포함할 때 사용 가능해집니다.

번역 단위는 라이브러리 헤더를 어떤 순서로든 포함할 수 있습니다. 각 헤더는 여러 번 포함될 수 있으며, 정확히 한 번 포함된 것과 다른 효과를 주지 않습니다. 단, <cassert> 또는 <assert.h> 을 포함하는 경우 그 효과는 매번 NDEBUG 의 어휘적으로 현재 정의에 따라 달라집니다.

번역 단위는 선언이나 정의 외부에서, 그리고 해당 번역 단위에서 해당 헤더에 선언된 어떤 엔티티에 대한 첫 번째 참조보다 어휘적으로 앞서는 헤더만 포함할 수 있습니다. 진단은 필요하지 않습니다.

모듈 유닛 에서 헤더는 전역 모듈 조각 에서만 포함될 수 있습니다.

(since C++20)

헤더 임포트

C++ 라이브러리 헤더 , 또는 독립 구현의 경우 구현에서 제공하는 이러한 헤더들의 부분집합을 통칭하여 임포트 가능한 C++ 라이브러리 헤더 라고 합니다.

임포트 가능한 C++ 라이브러리 헤더의 내용은 해당 임포트 선언 을 포함하는 번역 단위에서 사용 가능해집니다.

(C++20부터)

모듈 임포트

C++ 표준 라이브러리는 다음 C++ 라이브러리 모듈 들을 제공합니다:

표준 라이브러리의 각 선언에 대해,

  • 해당 선언이 부착되는 모듈 은 명시되지 않으며,
  • 헤더 포함, 헤더 유닛 임포트, 또는 C++ 라이브러리 모듈 임포트를 통해 도달 가능하게 되었는지 여부와 관계없이 동일한 엔티티 를 지칭합니다.
(C++23부터)

링크

C++ 표준 라이브러리의 개체들은 storage duration#external linkage 을 가집니다. 별도로 명시되지 않는 한, 객체와 함수는 기본적으로 extern "C++" linkage 를 가집니다.

C 표준 라이브러리에서 외부 링크를 가진 이름이 extern "C" 링크를 가지는지 extern "C++" 링크를 가지는지는 구현에 따라 정의됩니다. C++ 표준은 이 경우 extern "C++" 사용을 권장합니다.

C++ 프로그램에서 필요로 하는 라이브러리에 정의된 객체와 함수들은 프로그램 시작 전에 프로그램에 포함됩니다.

표준 라이브러리 구현에 대한 요구사항

보장

C++ 헤더는 declarations definitions 을 제공해야 합니다

  • 해당 헤더의 시놉시스, 또는
  • 해당 헤더의 시놉시스에 포함된 것으로 보이는 다른 헤더의 시놉시스.

여러 헤더에서 정의된 타입과 매크로(예: NULL )의 경우, 이러한 헤더들을 어떤 순서로든 임의의 개수만큼 포함하는 것이 One Definition Rule 을 절대 위반하지 않습니다.

별도로 명시되지 않는 한, C 표준 라이브러리에서 정의된 모든 object-like macros 는 정수형 constant expressions 로 확장되며, #if 전처리기 지시문에서 사용될 수 있습니다.

표준 라이브러리의 비멤버 함수 시그니처를 호출하면 항상 실제 해당 함수가 호출됩니다. 따라서 적합한 표준 라이브러리 구현은 유효한 C++ 프로그램에 의해 호출될 수 있는 추가적인 비멤버 함수를 정의할 수 없습니다.

비멤버 함수 시그니처에는 추가적인 default arguments 를 절대 선언하지 않습니다.

달리 명시되지 않는 한, 표준 라이브러리의 함수들이 비-연산자, 비-멤버 함수를 호출할 때 네임스페이스 에서 인수 의존 이름 탐색 을 통해 발견된 다른 함수들을 사용하지 않습니다.

클래스(템플릿) 정의 내에서 함수(템플릿)의 각 friend 선언 에 대해, 해당 함수(템플릿)에 대한 다른 선언은 제공되지 않습니다.

표준 라이브러리 함수 시그니처는 해당 함수가 constexpr 으로 지정되어야 하는 경우에만 constexpr 으로 선언될 수 있습니다(libstdc++ cmath의 경우 이 부분에서 표준을 따르지 않음 ). 헤더가 constexpr 함수나 생성자의 비정의 선언을 제공하는 경우, 해당 정의도 동일한 헤더 내에서 제공되어야 합니다.

별도로 명시되지 않는 한, 각 표준 라이브러리 함수는 다음 요구사항들을 모두 충족하여 데이터 경쟁 을 방지해야 합니다:

  • C++ 표준 라이브러리 함수는 함수의 인수(including this )를 통해 (직접 또는 간접적으로) 접근되지 않는 한, 현재 스레드 이외의 스레드에서 접근 가능한 객체들을 (직접 또는 간접적으로) 접근할 수 없습니다.
  • C++ 표준 라이브러리 함수는 함수의 비-const 인수(including this )를 통해 (직접 또는 간접적으로) 접근되지 않는 한, 현재 스레드 이외의 스레드에서 접근 가능한 객체들을 (직접 또는 간접적으로) 수정할 수 없습니다.
    • 예를 들어, 정적 저장 기간을 가진 객체는 동기화 없이는 내부 목적으로 사용될 수 없습니다. 이렇게 하면 스레드 간에 객체를 명시적으로 공유하지 않는 프로그램에서도 데이터 경쟁이 발생할 수 있기 때문입니다.
  • C++ 표준 라이브러리 함수는 해당 컨테이너 요소에 대한 사양에서 요구하는 함수들을 호출하는 경우를 제외하고, 인수를 통해 또는 container 인수의 요소들을 통해 간접적으로 접근 가능한 객체들을 접근할 수 없습니다.
  • 표준 라이브러리 컨테이너나 문자열 멤버 함수를 호출하여 얻은 iterator 에 대한 연산은 기본 컨테이너를 접근할 수 있지만 수정할 수는 없습니다.
    • 특히, iterator를 무효화하는 컨테이너 연산들은 해당 컨테이너와 연관된 iterator에 대한 연산들과 충돌합니다.
  • C++ 표준 라이브러리 함수는 해당 연산들의 효과가 사용자에게 visible 하는 경우에만 현재 스레드 내에서만 모든 연산들을 수행할 수 있습니다.
    • 부수 효과(side effect)가 보이지 않는 연산들은 병렬화될 수 있습니다.
(C++11부터)

C++ 표준 라이브러리에 정의된 각 클래스가 C++ 표준 라이브러리에 정의된 다른 클래스로부터 파생 되어야 하는 경우,

  • 기본 클래스는 virtual 로 지정된 경우 virtual 이어야 합니다,
  • 기본 클래스는 virtual 로 지정되지 않은 경우 virtual일 수 없으며,
  • 별도로 명시되지 않는 한, 서로 다른 이름을 가진 타입들은 서로 다른 타입이어야 합니다.

달리 명시되지 않는 한, C++ 표준 라이브러리에 명시된 모든 타입은 non- final 타입입니다.

(since C++11)

C++ 표준 라이브러리에 정의된 함수가 특정 상황에서 주어진 타입의 예외 를 던지도록 명시된 경우, 던져지는 예외는 해당 타입이나 해당 타입에서 파생된 타입만 가질 수 있으므로 기본 타입에 대한 예외 핸들러가 이를 catch할 수 있습니다.

C 표준 라이브러리의 함수들은 해당 함수가 예외를 던지는 프로그램 제공 함수를 호출할 때만 예외를 던질 수 있습니다 ( qsort() bsearch() 이 이 조건에 해당합니다).

C++ 표준 라이브러리에 정의된 소멸자 연산들은 예외를 절대로 던지지 않습니다. C++ 표준 라이브러리의 모든 소멸자는 마치 non-throwing exception specification 을 가진 것처럼 동작합니다.

C++ 표준 라이브러리의 함수가 std::error_code 객체를 통해 오류를 보고하는 경우, 운영 체제에서 발생한 오류에 대해서는 해당 객체의 category() 멤버가 std::system_category() 를 반환해야 하며, 다른 곳에서 발생한 오류에 대해서는 구현에서 정의된 std::error_category 객체에 대한 참조를 반환해야 합니다. 이러한 각 오류 범주에 대한 value() 의 가능한 값들은 정의되어야 합니다.

C++ 표준 라이브러리에 정의된 타입들의 객체는 이동될 수 있습니다 . 이동 연산은 명시적으로 지정되거나 암시적으로 생성될 수 있습니다. 달리 명시되지 않는 한, 이렇게 이동된 객체는 유효하지만 지정되지 않은 상태에 놓이게 됩니다.

C++ 표준 라이브러리에 정의된 타입의 객체는 자기 자신에게 이동 대입될 수 있습니다 . 달리 명시되지 않는 한, 이러한 대입은 객체를 유효하지만 지정되지 않은 상태에 놓습니다.

(C++11부터)

구현 자유도

C++ 표준 라이브러리의 멤버 함수 또는 비멤버 함수가 inline 으로 정의되는지 여부는 명시되지 않습니다.

비- virtual C++ 표준 라이브러리 멤버 함수의 경우, 주어진 선언 집합에서 오버로드를 선택하는 해당 멤버 함수에 대한 모든 호출이 해당 오버로드가 선택된 것처럼 동작하는 조건으로, 서로 다른 멤버 함수 시그니처 집합을 선언할 수 있습니다. 이는 예를 들어 다음과 같은 것을 허용합니다:

  • 기본 인자를 가진 매개변수 추가,
  • 기본 인자를 가진 멤버 함수를 동등한 동작을 하는 두 개 이상의 멤버 함수로 교체, 또는
  • 멤버 함수 이름에 대한 추가 시그니처 추가.

달리 명시되지 않는 한, C++ 표준 라이브러리의 어떤 함수들이 재귀적으로 재진입될 수 있는지는 구현에 따라 정의됩니다.

C++ 표준 라이브러리 구현은 사용자에게 보이지 않고 데이터 경쟁으로부터 보호되는 객체인 경우, 스레드 간에 자체 내부 객체를 공유할 수 있습니다.

(since C++11)

C++ 표준 라이브러리의 어떤 함수 시그니처나 클래스가 C++ 표준 라이브러리의 다른 클래스의 friend인지 여부는 명시되지 않습니다.

여기에 설명된 이름과 전역 함수 시그니처는 여기 구현에 예약되어 있습니다.

C++ 표준 라이브러리의 모든 클래스는 구현에 예약된 이름을 가진 클래스로부터 파생될 수 있습니다. C++ 표준 라이브러리에 정의된 클래스가 C++ 표준 라이브러리의 다른 클래스들로부터 파생되어야 하는 경우, 해당 클래스는 필요한 기본 클래스로부터 직접 파생되거나 구현에 예약된 이름을 가진 기본 클래스 계층을 통해 간접적으로 파생될 수 있습니다.

C++ 표준 라이브러리에 정의된 함수가 예외를 던지도록 명시되어 있지 않지만 비예외(non-throwing) 예외 명세를 가지고 있지 않은 경우, 던져지는 예외는 구현에 따라 정의되지만 그 타입은 std::exception 이거나 std::exception 에서 파생된 어떤 타입이어야 합니다.

비가상 함수의 예외 명세는 예외를 던지지 않는 명세를 추가하여 강화할 수 있습니다.

표준 라이브러리 강화

구현은 강화된 구현(hardened implementation)  일 수 있으며, 구현이 강화되었는지 여부는 구현에 따라 정의됩니다.

일부 표준 라이브러리 멤버 함수들(및 멤버 함수 템플릿들)은 hardened precondition  을 가지고 있습니다. 이러한 함수가 호출될 때:

  • 구현이 강화된 경우, 함수의 다른 관찰 가능한 부작용 이전에 하나 이상의 계약 단언 이 강화된 사전 조건에 기술된 술어와 함께 검사 의미론으로 평가됩니다. 이러한 단언 중 하나라도 비종료 의미론으로 평가되고 계약 위반 처리기 가 반환되면, 동작은 정의되지 않습니다.
  • 구현이 강화되지 않은 경우, 강화된 사전 조건이 위반될 때 동작은 정의되지 않습니다.

강화된 선행 조건을 가진 멤버 함수

**참고:** 제공된 HTML 조각에서 번역이 필요한 텍스트 요소가 없습니다. 모든 ` `, ` ` 태그 내의 "error" 텍스트는 C++ 관련 용어로 번역에서 제외되어야 하며, 다른 번역 가능한 텍스트 요소가 존재하지 않습니다. HTML 구조와 태그는 원본 그대로 유지됩니다.
카테고리 시퀀스 컨테이너 컨테이너 뷰 문자열 (뷰) 클래스 일반 유틸리티
숫자 배열
클래스 array vector inplace_vector deque list forward_list span mdspan basic_string basic_string_view bitset optional expected valarray
(생성자) span mdspan
요소 접근 operator* operator* operator*
operator-> operator-> operator->
operator[] operator[] operator[] operator[] operator[] operator[] operator[] operator[] operator[] operator[] operator[]
front front front front front front front front front front
back back back back back back back back back
error error
서브뷰 first first
last last
subspan subspan
수정자 pop_front pop_front pop_front pop_front
pop_back pop_back pop_back pop_back pop_back pop_back
remove_prefix remove_prefix
remove_suffix remove_suffix
(C++26 이후)

참고 사항

libstdc++ , libc++ , 그리고 STL 모두 C++20 모드에서 표준 라이브러리 모듈 사용을 지원합니다.

기능 테스트 매크로 표준 기능
__cpp_lib_modules 202207L (C++23) 표준 라이브러리 모듈 std std. compat
강화 구현만 해당
__cpp_lib_hardened_array 202502L (C++26) 강화된 std::array
__cpp_lib_hardened_basic_string 202502L (C++26) 강화된 std::basic_string
__cpp_lib_hardened_basic_string_view 202502L (C++26) 강화된 std::basic_string_view
__cpp_lib_hardened_bitset 202502L (C++26) 강화된 std::bitset
__cpp_lib_hardened_deque 202502L (C++26) 강화된 std::deque
__cpp_lib_hardened_expected 202502L (C++26) 강화된 std::expected
__cpp_lib_hardened_forward_list 202502L (C++26) 강화된 std::forward_list
__cpp_lib_hardened_inplace_vector 202502L (C++26) 강화된 std::inplace_vector
__cpp_lib_hardened_list 202502L (C++26) 강화된 std::list
__cpp_lib_hardened_mdspan 202502L (C++26) 강화된 std::mdspan
__cpp_lib_hardened_optional 202502L (C++26) 강화된 std::optional
__cpp_lib_hardened_span 202502L (C++26) 강화된 std::span
__cpp_lib_hardened_valarray 202502L (C++26) 강화된 std::valarray
__cpp_lib_hardened_vector 202502L (C++26) 강화된 std::vector

결함 보고서

다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.

DR 적용 대상 게시된 동작 올바른 동작
LWG 1 C++98 C 표준 라이브러리의 이름들의 언어 링크가
명시되지 않았음
구현에 따라 정의됨
LWG 119 C++98 가상 함수의 예외 명세가 강화될 수 있었음 비가상 함수에만 허용됨
LWG 147 C++98 비멤버 함수 명세가 전역 함수만 고려했음 비전역 함수도 고려함
LWG 225 C++98 표준 라이브러리 함수가 인수 의존적 탐색으로 인해
다른 네임스페이스의 비멤버 함수를 호출할 수 있었음
달리 명시되지 않는 한 금지됨
LWG 336 C++98 <strstream> 이 C++ 라이브러리 헤더가 아니었음 C++ 라이브러리 헤더임
LWG 343 C++98 라이브러리 헤더 종속성이 명시되지 않았음 명시됨 (개요에 나열됨)
LWG 456 C++98 C 라이브러리 기능을 위한 C++ 헤더가
std 네임스페이스에서만 정의를 제공할 수 있었음
전역 네임스페이스에서 정의한 후
std 네임스페이스로 주입하는 것이 허용됨
LWG 465 C++98 C++에서 키워드나 연산자인 식별자가
C++ 표준 라이브러리 헤더에서 매크로로 정의될 수 있었음
( <ciso646> 만 매크로로 정의하지 않아야 함)
모든 C++ 표준 라이브러리 헤더가
이를 매크로로 정의할 수 없음
LWG 1178 C++98 C++ 헤더는 필요한 정의를 포함하는
C++ 헤더를 반드시 포함해야 했음
C++ 헤더는 직접 또는 간접적으로
개요에 포함된 선언과 정의를
반드시 제공해야 함
LWG 2013 C++11 표준에서 constexpr을 요구하지 않는 함수를
표준 라이브러리가 constexpr 으로 선언할 수 있는지 명시되지 않았음
금지됨
LWG 2225 C++98 헤더가 잘못된 위치에서 포함될 경우
진단 메시지가 필요했음
이 경우 진단 메시지가
필요하지 않음