C++ Standard Library
C++ 표준 라이브러리는 표준 C++에서 사용 가능한 다양한 기능들을 제공합니다.
목차카테고리언어 지원 라이브러리 는 메모리 할당 ( new / delete ) 및 예외 처리 와 같은 C++ 언어의 특정 부분에서 요구되는 구성 요소들을 제공합니다.
진단 라이브러리 는 C++ 프로그램에서 오류를 보고하기 위한 일관된 프레임워크를 제공하며, 미리 정의된 예외 클래스들 을 포함합니다. 메모리 관리 라이브러리 는 메모리 관리를 위한 구성 요소들을 제공하며, 여기에는 스마트 포인터 와 스코프 할당자 (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 구성 요소 를 제공합니다. 이들은 라이브러리의 다른 요소, 특히 문자열, 로케일 및 반복자와 함께 사용될 수 있습니다.
라이브러리 내용C++ 표준 라이브러리는 entities 와 macros 에 대한 정의를 C++ standard library headers 의 개요에 설명된 대로 제공하며, 별도로 명시되지 않는 한 이를 따릅니다. operator new 및 operator delete 를 제외한 모든 라이브러리 개체는 std 네임스페이스 내부 또는 std 네임스페이스 내부에 중첩된 네임스페이스 내에 정의됩니다 (C 표준 라이브러리 기능에 대한 개체는 아래 참조). 특정 네임스페이스에서 선언된 이름이 해당 네임스페이스에 직접 선언되는지, 아니면 그 네임스페이스 내부의 인라인 네임스페이스 에 선언되는지는 명시되지 않습니다. (C++11부터) 헤더
C++ 표준 라이브러리의 각 요소는 적절한
헤더
에 선언되거나 정의됩니다. 헤더가 반드시 소스 파일일 필요는 없으며, 헤더 이름에서
C++ 표준 라이브러리는 C++ 라이브러리 헤더 와 C 라이브러리 기능을 위한 추가 C++ 헤더 를 제공합니다 (설명은 " headers " 페이지 참조):
독립형 구현 은 구현에서 정의된 헤더 집합을 가지며, 헤더 집합에 대한 최소 요구사항은 여기 를 참조하십시오. C 표준 라이브러리C++ 표준 라이브러리는 또한 C 표준 라이브러리의 기능들을 정적 타입 안전성을 보장하도록 적절히 조정하여 제공합니다. 많은 라이브러리 함수들의 설명은 해당 함수들의 의미론(semantics)에 대해 C 표준 라이브러리에 의존합니다. 일부 경우에는 표준 C++에 명시된 시그니처가 C 표준 라이브러리의 시그니처와 다를 수 있으며, 추가적인 오버로드가 선언될 수 있지만, 달리 명시되지 않는 한 동작과 사전 조건 (C의 restrict 에 의해 암시되는 것들을 포함하여) (C++17부터) 은 동일합니다. C++ 표준 라이브러리는 C 표준 라이브러리와의 호환성을 위해 아래에 열거된 C 헤더들을 제공합니다. 이러한 헤더들의 사용 목적은 상호 운용성에만 한정됩니다. 유효한 ISO C가 되기 위해 C++ 소스 파일이 이러한 헤더들 중 하나를 포함해야 할 수 있습니다. 동시에 유효한 ISO C가 될 의도가 없는 소스 파일들은 C 헤더들 중 어떤 것도 사용해서는 안 됩니다. 설명은 여기 를 참조하십시오.
달리 명시되지 않는 한, 각 헤더
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++ 표준 라이브러리의 엔티티들은 헤더에 정의되어 있으며, 해당 헤더의 내용은 번역 단위가 적절한 #include 전처리 지시자를 포함할 때 사용 가능해집니다. 번역 단위는 라이브러리 헤더를 어떤 순서로든 포함할 수 있습니다. 각 헤더는 여러 번 포함될 수 있으며, 정확히 한 번 포함된 것과 다른 효과를 주지 않습니다. 단, <cassert> 또는 <assert.h> 을 포함하는 경우 그 효과는 매번 NDEBUG 의 어휘적으로 현재 정의에 따라 달라집니다. 번역 단위는 선언이나 정의 외부에서, 그리고 해당 번역 단위에서 해당 헤더에 선언된 어떤 엔티티에 대한 첫 번째 참조보다 어휘적으로 앞서는 헤더만 포함할 수 있습니다. 진단은 필요하지 않습니다.
링크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
로 확장되며,
표준 라이브러리의 비멤버 함수 시그니처를 호출하면 항상 실제 해당 함수가 호출됩니다. 따라서 적합한 표준 라이브러리 구현은 유효한 C++ 프로그램에 의해 호출될 수 있는 추가적인 비멤버 함수를 정의할 수 없습니다. 비멤버 함수 시그니처에는 추가적인 default arguments 를 절대 선언하지 않습니다. 달리 명시되지 않는 한, 표준 라이브러리의 함수들이 비-연산자, 비-멤버 함수를 호출할 때 네임스페이스 에서 인수 의존 이름 탐색 을 통해 발견된 다른 함수들을 사용하지 않습니다. 클래스(템플릿) 정의 내에서 함수(템플릿)의 각 friend 선언 에 대해, 해당 함수(템플릿)에 대한 다른 선언은 제공되지 않습니다.
C++ 표준 라이브러리에 정의된 각 클래스가 C++ 표준 라이브러리에 정의된 다른 클래스로부터 파생 되어야 하는 경우,
C++ 표준 라이브러리에 정의된 함수가 특정 상황에서 주어진 타입의 예외 를 던지도록 명시된 경우, 던져지는 예외는 해당 타입이나 해당 타입에서 파생된 타입만 가질 수 있으므로 기본 타입에 대한 예외 핸들러가 이를 catch할 수 있습니다. C 표준 라이브러리의 함수들은 해당 함수가 예외를 던지는 프로그램 제공 함수를 호출할 때만 예외를 던질 수 있습니다 ( qsort() 와 bsearch() 이 이 조건에 해당합니다). C++ 표준 라이브러리에 정의된 소멸자 연산들은 예외를 절대로 던지지 않습니다. C++ 표준 라이브러리의 모든 소멸자는 마치 non-throwing exception specification 을 가진 것처럼 동작합니다.
구현 자유도C++ 표준 라이브러리의 멤버 함수 또는 비멤버 함수가 inline 으로 정의되는지 여부는 명시되지 않습니다. 비- virtual C++ 표준 라이브러리 멤버 함수의 경우, 주어진 선언 집합에서 오버로드를 선택하는 해당 멤버 함수에 대한 모든 호출이 해당 오버로드가 선택된 것처럼 동작하는 조건으로, 서로 다른 멤버 함수 시그니처 집합을 선언할 수 있습니다. 이는 예를 들어 다음과 같은 것을 허용합니다:
달리 명시되지 않는 한, C++ 표준 라이브러리의 어떤 함수들이 재귀적으로 재진입될 수 있는지는 구현에 따라 정의됩니다.
C++ 표준 라이브러리의 어떤 함수 시그니처나 클래스가 C++ 표준 라이브러리의 다른 클래스의 friend인지 여부는 명시되지 않습니다. 여기에 설명된 이름과 전역 함수 시그니처는 여기 구현에 예약되어 있습니다. C++ 표준 라이브러리의 모든 클래스는 구현에 예약된 이름을 가진 클래스로부터 파생될 수 있습니다. C++ 표준 라이브러리에 정의된 클래스가 C++ 표준 라이브러리의 다른 클래스들로부터 파생되어야 하는 경우, 해당 클래스는 필요한 기본 클래스로부터 직접 파생되거나 구현에 예약된 이름을 가진 기본 클래스 계층을 통해 간접적으로 파생될 수 있습니다. C++ 표준 라이브러리에 정의된 함수가 예외를 던지도록 명시되어 있지 않지만 비예외(non-throwing) 예외 명세를 가지고 있지 않은 경우, 던져지는 예외는 구현에 따라 정의되지만 그 타입은 std::exception 이거나 std::exception 에서 파생된 어떤 타입이어야 합니다. 비가상 함수의 예외 명세는 예외를 던지지 않는 명세를 추가하여 강화할 수 있습니다.
참고 사항libstdc++ , libc++ , 그리고 STL 모두 C++20 모드에서 표준 라이브러리 모듈 사용을 지원합니다.
예제이 코드 실행하기 import std;
struct Str : std::string // OK, std::string cannot be final
{
~Str(); // Guaranteed to be noexcept
};
int main()
{
std::puts("Hello stdlib!");
// ::puts("Hello stdlib!"); // Requires std.compat module or stdio.h header
// constexpr auto& void_info = std::any().type(); // std::any::type cannot be constexpr
std::string t;
t = std::move(t); // OK, t is left in a valid (but unspecified) state
}
출력: Hello stdlib!
결함 보고서다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||