1. 개요
C++의 역사를 정리한 문서2. 역사
2.1. 모던 C++
각종 주요 컴파일러들과 모던 C++의 호환성은 여기서 볼 수 있다.2.1.1. C++26
C++26 변경사항 | ||
{{{#!wiki style="margin: 0 -10px" | <colbgcolor=#9FC9BF,#06452A>모듈 | 설명 |
<debugging> | 40년 동안 개발자들이 직접 구현하거나 각종 IDE에서 직접 마련해주어 중구난방이었던 디버그 환경을 통합하는 모듈. 디버그 모드인지 여부 확인, 그리고 중단점(Breakpoint)의 동적인 생성 및 관리가 가능함 | |
<text_encoding> | 현재 실행 환경의 문자 인코딩 정보를 보여주는 모듈 [1] | |
<inplace_vector> | ||
<rcu> | CRTP & 스레드 멈춤 없는(Non-Blocking) 방식으로 안전한 읽기, 쓰기, 삭제를 할 수 있는 원자적 클래스를 만들고 관리하는 유틸리티를 제공하는 모듈 | |
<hazard_pointer> | CRTP & RAII & 스레드 멈춤 없는(Non-Blocking) & 배타적 메모리 소유권(Ownership) 방식으로 하나의 포인터에 대하여 단일 쓰기 / 다중 읽기가 가능한 원자적 연산을 제공하는 모듈 | |
<linalg> | <mdspan> 을 활용해 선형대수 연산을 제공하는 모듈 | |
<functional> |
|
2.1.2. C++23
C++23 변경사항 | ||
{{{#!wiki style="margin: 0 -10px" | <colbgcolor=#FAEE9E,#180809>모듈 | 설명 |
| 함수의 호출 스택을 드러내는 리플렉션 라이브러리 | |
| 오류 코드 및 예외 방식을 대체하는 클래스. 모나드 연산을 지원한다 | |
| 불편한 다중 배열을 대체하는 클래스. std::span 과는 다르게 실제 데이터를 소유할 수 있다 | |
| 너무 낡고 저성능인 iostream 을 대체하는 출력 라이브러리. 콘솔 뿐만 아니라 FILE 포인터로 출력이 가능하다 | |
| 클래스에서 스트림 입출력을 지원하는 라이브러리 | |
<flat_map> , <flat_set> | 실제로 연관 컨테이너가 아닌 컨테이너에서도 사상 연산을 지원하는데 도와주는 인터페이스 클래스 | |
| 코루틴을 통해 비동기 범위 연산을 지원하는 클래스. 범위 기반 for문을 비동기적으로 실행할 수 있다 | |
|
| |
|
|
호출 스택 추적(리플렉션), executor 등이 추가될 예정이었으나, 전세계적인 코로나 바이러스 판데믹으로 인해 표준 위원회의 작업이 더뎌지고 있다. 주로 다른 언어의 장점을 취합하여 C++20까지의 결점이나 부족했던 기능들 등을 보완하는 패치이다.
- 개별 헤더가 아닌 표준 라이브러리 전체에 대해 모듈 지원.
import std;
또는 호환성을 위해import std.compat;
으로 사용 가능함 - 정적 [] 연산자
- 정적 () 연산자
- 인덱스 참조 연산자 [] 에 여러 개의 인자를 전달할 수 있음
- 람다 표현식에 특성을 사용할 수 있음
constexpr
함수 안에서goto
문을 포함하여 상수 평가식이 아닌 구문을 사용할 수 있음. 왜냐하면 C++23에 와서는constexpr
는 반드시 상수 평가식이 아니라, 컴파일 시간에 실행될 수도 있는 표현식이기 때문임. 대신 문맥 구분을 위해 반드시std::is_constant_evaluated()
를 사용해야함- 완벽한 인자 전달 (Perfect Forwarding)을 위해
std::forward
대신에auto(glvalue)
,auto{glvalue
}를 사용할 수 있음 - 새로운 특성
[[assume(expression)]]
2.1.3. C++20
C++20 변경사항 | ||
{{{#!wiki style="margin: 0 -10px" | <colbgcolor=#F3E5FA,#1a0320>모듈 | 설명 |
| concept 를 활용한 템플릿 제약조건 라이브러리 | |
| 기존의 >= , > , < , <= 를 대체하는 <=> 연산자 지원 라이브러리 [2] | |
| 뮤텍스를 사용하는 스트림 인터페이스 라이브러리 | |
| 문자열 형식화 라이브러리 | |
| 횟수 세기 기반의 1회용 동기화 클래스 | |
| 접근하는 스레드를 묶음 단위로 관리하고, 접근하는 스레드를 대기 상태로 만들어 최대 횟수에 도달하면 재시작하는 동기화 클래스 | |
| 접근하는 스레드의 수를 제한하는 동기화 클래스 | |
| 코루틴 프레임워크 | |
<source_location> | C의 코드 정보 매크로를 대체하기 위한 라이브러리 | |
| 수학 상수 | |
| std::string_view 와 같이 동적 할당없는 연속된 메모리 보기를 지원하는 클래스 | |
| 두가지 목적이 있다. std::ranges 에서 컨테이너 오류를 원천 차단하기 위해 제약조건을 꼼꼼하게 달아서 헤더를 대체하는 목적, 그리고 std::views 의 범위 대리자 클래스를 통해 동적할당 없이 일반화된 범위[3] 연산을 지원하는 것. 오랜만에 나온 제대로 된 일반화 프로그래밍 라이브러리이기도 하다 |
2020년에 최종 승인된 C++20은 C++11, C++14, C++17에 이은 주요 버전이다. 비동기 프로그래밍을 지원하기 위한 코루틴[4], 컴파일 속도 향상을 위한 소스 파일 모듈화[5], 템플릿에 제약 조건을 추가하기 위한 컨셉트[6] 등 다양한 기능들이 추가될 예정이다. 그 외에 추후 표준에[7] 추가될 수 있는 리플렉션과 네트워크 라이브러리
놀라운 점은 C++20에 추가된 기능들과 C++20에 다 반영되지 못한 대신 다음 C++ 표준에 포함될 예정인 기능들이 대부분 C++TR2 제안서에 이미 언급되어 있던 사양이라는 특징이 있다. 표준화로서 최소 15년만에 빛을 발하게 된 셈.
- 모듈 지원. 표준 라이브러리는 개별 헤더만 지원함
- 부동 소수점에 대해 원자 클래스
std::atomic
지원 - 노가다를 줄여주는
std::remove_cvref
- 컴파일 시간에 힙 메모리 할당과 소멸이 가능함
constexpr std::allocator
,std::construct_at
,std::destroy
,std::destroy_at
constexpr std::vector
constexpr std::string
std::is_constant_evaluated();
함수를 통해 현재 컴파일 시점인지 아닌지 알 수 있음- 가상, 추상 함수도
constexpr
이 될 수 있음 - 소멸자도
constexpr
이 될 수 있음. 기본 생성자, 소멸자가 모두constexpr
라면 자명 (Trivial)한 클래스가 되고consteval
함수의 반환 값, 각종 상수 평가식, 그리고 템플릿 매개변수로 사용할 수 있음 constexpr
함수에try
문을 사용할 수 있음. 만약 상수 시간에 오류가 발생하면 즉시 알 수 있음consteval
로 이젠 모든 것이 다 되는constexpr
특유의 모호성을 제거하고 반드시 상수 시간에 평가하도록 설정할 수 있음constinit
를 통해static
변수를 컴파일 시간에 초기화할 수 있음- 함수를 정의할 때
noexcept(상수 bool 평가식)
와 같이 선택적으로noexcept
를 지정할 수 있음 <chrono>
에서 년월일, 요일, 주말, 날짜, C 라이브러리를 대체하는 시간대 권역 지원<thread>
에서 소멸자에서 자동으로join()
을 실행하는std::jthread
클래스가 추가됨. 그리고std::stop_token
,std::stop_source
를 이용해 스레드 진행을 원격으로 멈출 수 있음 [8]- 새로운 특성
[[no_unique_address]]
- 새로운 특성
[[likely]]
,[[unlikely]]
[9]
2.1.4. C++17
C++17 변경사항 | ||
{{{#!wiki style="margin: 0 -10px" | <colbgcolor=#EFFAFD,#08131B>모듈 | 설명 |
| 다양한 타입의 값 하나를 넣을 수 있는 만능타입 클래스 | |
| 값의 존재 여부를 선택적으로 결정할 수 있는 클래스 | |
| 타입 안전한 결합체 (union ) | |
<memory_resource> | 동적할당하는 방법 자체를 런타임 시점에 결정하는 클래스 | |
<string_view> | 메모리를 수정하지 않는 읽기 전용 문자열 클래스 | |
| OS수준의 파일관리를 간편하게 접근 (디렉토리 탐색, 파일 복사 및 삭제 등) | |
| 병렬 STL 알고리즘 | |
|
| |
|
|
2017년 12월에 C++1z로 알려졌던 C++17 표준이 ISO/IEC 14882:2017이라는 정식 명칭으로 최종 승인되었다. C++11의 추가 요소들을 다듬고 향상시키는데 주력했던 C++14에 비해, C++17은 표준 라이브러리의 새로운 기능에 비교적 주력한다. 초안 단계에서부터 논란이 많은 표준안이기도 하다. C++11/14의 실정에 맞추어 옛날 기능을 삭제하자는 안이 많기 때문인데[10], deprecated 판정을 받은
std::auto_ptr
이나 삼중자(trigraph)[11] 등이 삭제되었다. 이는 옛 코드에 대한 호환성을 포기하는 것이기 때문에, 오래된 코드들이 최신 컴파일러에서 컴파일되지 않을 가능성이 크다. 이 때문에 IBM에서 문자체계의 문제를 내세워 삼중자를 제거하지 말라고 회사 차원에서 표준화 위원회에 진정서를 제출했었다. #Visual Studio의 경우 2017 이상, GCC의 libstdc++의 경우 9 이상에서 지원한다.
- 템플릿 인자 추론
{{{#!syntax cpp template<typename T> class Aaa {};
Aaa(T) -> Aaa<T>;}}}와 같이 사용자가 템플릿의 추론 방법을 직접 명시할 수 있음. 가령
std::vector v{1, 2, 3};
의 경우 v는 std::vector<int>
로 연역됨.- 구조적 바인딩: 튜플 또는 집합 구조체를 풀어쓰는 기능을 제공함. 가령
auto [a, b, c] = std::tuple(4, 5, 6);
에서a
는 4,b
는 5,c
는 6이 됨 - 클래스의 객체를 생성하기 위해 생성자에 바로 같은 클래스 객체를 전달했을때, 해당 클래스의 이동 생성자가 존재한다면 순수한 R-Value가 되어 마치 존재하지 않은 것처럼 처리됨. 예를 들어 이동 생성자가 있는 클래스 A를 생성할 때
A aaa{A{}};
에서 안쪽의A{
}는 코드 상에만 보이고 실행 시점에는 보이지 않는 존재가 됨 noexcept
속성이 함수의 자료형에 포함됨. 함수 포인터, 람다 표현식, 함자 객체에서noexcept
를 명시한 것과 하지 않은 것이 다른 함수로 취급됨- 람다 표현식의 문맥 캡처 부분에
this
를 사용할 수 있음. 이를 통해 자신의 메서드, 필드만 캡처할 수도 있음 constexpr
람다 표현식if constexpr
if
문과 사용법은 같지만, 평가되고 실행되는 내용은 컴파일 시점에 즉시 결정됨. 실행되지 않는 쪽은 아예 코드에서 제거됨. 이를 이용해 오버로딩 없이 완전 다른 자료형을 반환하는 함수를 만들 수 있음inline
을 변수 선언에 사용할 수 있음.static inline
필드는 선언 즉시 값을 할당할 수 있음. 어떤 이름공간 안에 있는inline constexpr
변수는static
변수처럼 중복 선언이 일어나지 않으며 항상 단일하게 존재하는 이름이 됨. 템플릿inline constexpr
변수는 늦게 평가되며 컴파일 시점에 값이 그대로 대입됨. 그리고static constexpr
의 경우 자동으로static inline constexpr
로 연역됨- 중첩되는 이름공간을
namespace ns1::ns2 { ...;
}와 같이 바로 선언할 수 있음 - 이름없는 매개 변수가 가능해짐. 함수에
std::in_place
,std::in_place_type<T>
같은 메타 인자를 전달할 때 유용함 Enum en{ value };
과 같이 열거형의 생성, 대입을 형변환 없이 바로 할 수 있음. 이는enum class
에도 적용됨- 번거롭게
alignas
를 클래스에 붙일 필요 없이std::aligned_alloc
로 동적으로 메모리 할당과 동시에 정렬이 가능해짐 - 새로운 특성
[[fallthrough]]
- 새로운 특성
[[maybe_unused]]
- 새로운 특성
[[nodiscard]]
,[[nodiscard(message)]]
그외 새로운 기능들은 이곳에 잘 정리되어 있다.
2.1.5. C++14
C++14 변경사항 | ||
{{{#!wiki style="margin: 0 -10px" | <colbgcolor=#FFFCFD,#110D12>모듈 | 설명 |
<shared_mutex> | 단일 쓰기 & 다중 읽기 잠금을 지원하는 상호배제 클래스 | |
|
| |
|
|
2014년 8월에 ISO/IEC 14882:2014라는 정식 명칭으로 C++14이 제정되었다. 표준안 작성 당시 C++0x라 불리었던 C++11처럼 C++14도 C++1y라는 코드네임으로 불렸으며, 주로 C++11에 추가된 요소들을 다듬고 확장하는 데 치중한 비교적 마이너 표준안이다.
- 템플릿 변수 #
auto
를 사용한 함수의 반환형 추론auto
를 사용한 일반화된 람다 표현식constexpr
함수에서static_assert
,typedef
와using
을 사용한 자료형 별칭 선언,using namespace
,using type::필드, 메서드, 생성자
등을 사용할 수 있음- 아무것도 안하거나, 아무것도 반환하지 않는
constexpr
함수가 허용됨 1'000'000'000
와 같이'
를 사용하여 자리수를 구분할 수 있음0b011101101
와 같이 두문자0b
를 붙여 2진수를 사용할 수 있음.'
도 사용 가능함
2.1.6. C++11
C++11 모듈 목록 | ||||
{{{#!wiki style="margin: 0 -10px" {{{#!folding [ 펼치기 · 접기 ] |
|
| <system_error> | |
<type_traits> |
|
| ||
|
|
|
|
|
|
|
|
|
|
|
|
| ||
|
| |||
<initializer_list> |
| |||
|
|
|
|
|
|
| <scoped_allocator> |
| |
|
| |||
|
| <forward_list> |
|
|
|
| <unordered_set> | <unordered_map> | |
|
| |||
|
| <conditional_variable> |
| |
|
|
|
새로운 기능들이 많이 포함되었던 C++TR1이 정식 표준으로 채택되지 못 해서 대부분의 프로그래머들에게 있어서 C++은 C++98 이후 13년 간 정체된 언어나 다름 없었다. 2011년 8월 12일에 최신 컴퓨팅 환경을 지원하기 위해 급격한 변화의 첫 단추를 끊은 새로운 표준안인 C++11이 ISO/IEC 14882:2011라는 정식 명칭으로 최종 승인되었다. 최종 승인되기 전까지 표준안 개발 당시엔 C++0x라 불리었는데, 2000년대 안에는 표준화가 될 것이라는 의미였다. 하지만 결국 2000년대가 끝나고 2011년 8월에서야 정식 C++ 표준이 되어서 11이 붙었다. # 여담이지만 추가된 많은 기능 중 상당수 항목들이 Boost 라이브러리를 다수 참조했다. 아예 Boost 라이브러리 개발진 중 다수가 C++ 표준화 위원이기도 하다. 차세대 C++에 들어갈 요소를 미리 개발해서 시험해본 것이라 봐도 무방하다.
우측값 참조자를 이용한 이동 연산[12],
constexpr
, std::initializer_list
, 범위 기반 for 문[13], 람다 표현식, 스마트 포인터[14], 정규표현식[15], 멀티쓰레드 등등 중요한 신 개념과 편의 기능들이 많이 추가되었으므로 반드시 확인할 필요가 있다. C++11에 추가된 내용만 적절히 활용해도 코드의 작성과 관리가 보다 명확하고 더 쉬워진다.C++ 표준 위원회는 C++98에서 C++11까지 업데이트가 나오는 데 시간이 매우 오래 걸린 것이 업데이트가 잘 완성된 후에 발표하려고 했던 접근 방식 때문이었다고 자평한 뒤, 이러한 완벽주의를 버리고 3년에 한 번씩 그때까지 정리된 업데이트만 발표하는 형식(기차 모델)으로 규칙적인 업데이트를 하는 것이 훨씬 생산적인 접근방식이라고 결정했다.
====# C++TR1 #====
2005년 6월 24일에 표준 라이브러리를 확장하는 것을 골자로 하는 C++ 테크니컬 리포트의 초안이 작성되어 2007년 11월에 제정되었다.
첫 번째 테크니컬 리포트라고 해서 C++TR1으로 알려져 있는데 혹자는 이를 표준안과 동급으로 간주하고 C++07/TR1이라 부르기도 한다. 정식 명칭은 ISO/IEC TR 19768:2007이며, C++ 표준화 이후 사실상 언어에 변화를 가한 첫 번째 사양이지만 엄밀하게 표준안은 아니라서 컴파일러 제작사가 원하면 넣고 아니면 마는 수준의 선택적인 확장안이었다. 그래서인지 전부
std
네임스페이스에 들어가 있지 않고 대신 std::tr1
네임스페이스로 분리되어 들어간다. 이후 C++TR1의 기능들은 대부분 C++11 표준 사양으로 흡수된다.C++TR1 초안이 발표되기 2달 전인 2005년 4월 29일에 C++TR2의 초안에 대한 작업을 시작했었다. 여기에는 유니코드, XML/HTML, 네트워킹, 파일 시스템 등의 기능이 포함될 예정이었으나, 이는 무산되었다. 대신, 각각의 라이브러리와 기능들을 "Technical Specifications"이라는 별도의 비표준 기술 사양으로 별도로 제정하기 시작했다. 여기에는 파일 시스템, 병렬 컴퓨팅, 트랜잭셔널 메모리, 컨셉트, Range, 코루틴, 네트워킹, 모듈, 리플렉션 그리고 심지어 그래픽까지 있지만, 이러한 것들이 추후 표준에 포함될 지 또는 얼마나 수정될 지는 미정이다. C++TR2의 일부 사양이 C++11에 포함되었으며, C++17, C++20에 해당하는 기능들까지 포함되어 있는 등 실험적인 성격의 사양임을 짐작할 수 있다.
이러한 시범 사양은
std::experimental
네임스페이스에 포함되어, MSVC나 Clang에서 일부 지원했다. 시범적인 사양은 이 사이트에서 확인할 수 있다.2.2. 클래식 C++
====# C++03 #====C++03 모듈 목록 | |||||
{{{#!wiki style="margin: 20 -10px" {{{#!folding [ 펼치기 · 접기 ] |
|
| <type_traits> | ||
|
|
|
|
| |
|
|
|
|
| |
|
|
|
|
|
|
|
|
|
|
| |
|
| ||||
|
| ||||
|
|
|
2003년에 C++98 문서의 애매모호했던 부분들을 보완한 C++03이 ISO/IEC 14882:2003라는 정식 명칭으로 제정되었는데, 이는 그냥 표준화 문서상 불명확했던 것을 교정한 버전이다. 예를 들어
std::vector
가 배열처럼 연속된 메모리를 차지하도록 표준에 명시했다. 사실 당시 컴파일러들 대다수가 이미 C++03 제정 이전부터 이러한 부분들을 잘 구현한지라, 실제 프로그래머 입장에서 변한 건 없다.====# C++98 (1998년) #====
1998년에 최종 승인된 C++의 첫 공식 표준안으로, C++ 2.0 이후 C++가 안정적으로 정착하고 수요가 폭증함에 따라 여러 회사에서 상업용으로 컴파일러를 만들었고, 이에 따라 코드가 컴파일러에 따라 중구난방이 되는 것을 막기 위해 표준화의 필요성이 제기된다. 그래서 1990년에 ANSI에서 C++ 표준화를 위한 위원회가 설립되었으나 1991년에 ISO로 넘기면서 스트로우스트루프를 비롯한 프로그래밍 언어학자 및 컴파일러 제조사들을 모아 표준화 작업을 하기 시작한다.[16] 그렇게 C++의 표준안이 ISO/IEC 14882:1998라는 공식 명칭으로 처음 제정되었으며, 이를 줄여 C++98이라 부른다.
====# C++ 2.0 (1989년) #====
1989년에 다중 상속, 추상 클래스, static 멤버 함수, const 멤버 함수 및 protected 멤버 등의 새로운 기능들이 추가된 C++ 2.0이 발표되었으며, 컴파일러의 프론트엔드도 Cfront 2.0으로 업그레이드되었다.
1990년에 C++ 2.0에 추가된 기능 외에 템플릿, 예외, 네임스페이스, new casts 및 bool 타입 등의 새로운 기능들이 추가된 '주석이 달린 C++ 레퍼런스 메뉴얼'이 발표되었고 1991년에 컴파일러 프론트엔드가 Cfront 3.0으로 업그레이드되었으며, The C++ Programming Language의 첫 번째 개정판이 발행되었다.
====# C++ (1983년) #====
1983년에 가상 함수, 연산자 오버로딩, 참조, const, new/delete 연산자 등을 포함한 새로운 기능들이 추가되면서 언어 이름도 C with Classes에서 C++로 변경되었다. 이 시점에서 이미 클래식 C++의 틀은 완전히 잡혔다고 할 수 있으며, 이때까지는 거의 스트로우스트루프가 언어 개발을 전담하다시피 했다.
1985년에 본인이 쓴 책인 The C++ Programming Language를 통해 C++라는 언어를 정의하여 레퍼런스 컴파일러를 배포하는 식으로 개발되었다. 한편, 컴파일러 쪽에서는 백엔드는 여전히 C 컴파일러이지만 프론트엔드만 Cfront라는 이름으로 새로 개발되었다.
====# C with Classes (1979년) #====
1979년에 비아르네 스트로우스트루프가 속도가 느리지만 객체 지향적인 언어인 Simula의 컨셉을 C언어에 접목시키면서 C with Classes라는 이름으로 만들었다.
[1]
, <iostream>
에서 활용할 수 있다[2] C#의 CompareTo()와 같다.[3] begin(); end();
를 지원하는 클래스[4] 언어 차원에서 지원하기 때문에, 비동기 프로그래밍을 위해 별도의 라이브러리가 필요하지 않게 된다.[5] 소스 파일이 각각의 헤더 파일을 일일이 포함하는 대신, 미리 컴파일된 모듈을 사용함으로써 컴파일 속도가 크게 향상된다. 별도의 시범 사양으로도 공개되어 있기 때문에, Visual Studio의 C++ 컴파일러와 Clang 컴파일러에서 이미 시범적으로 지원하고 있다.[6] 현존하는 템플릿 트릭의 대다수를 대체할 수 있으므로 코드가 간결해지고 가독성이 증가한다.[7] 3년 주기를 따를 경우 C++23이 된다.[8] 다른 언어에서 보이는 Cancellation\*류의 클래스다.[9] 분기 예측으로, 리눅스 커널을 공부해본 사람은 아닌 그 likely(), unlikely() 매크로와 유사하다[10] C++11 제정 당시에도 std::auto_ptr
등 많은 옛날 요소들이 deprecated로 명시되어 사용이 자제될 것을 권장받았으나, 이는 어디까지나 권고라 사용자가 맘 놓고 쓰려면 쓸 수 있었다. 이전 버전의 기능을 아예 죽여버린 사례는, C++98 시절에 실상 누구도 안 썼고 지금은 아예 용도가 바뀌어버린 auto
등 극소수만이 해당한다.[11] C/C++의 특수기호는 미국의 부호체계인 ASCII를 기반으로 하고 있기 때문에 해당 영역에 다른 문자를 넣어 사용하던 유럽국가들의 코드페이지에서는 이상하게 표현되는 일이 있었다. 그래서 잘 사용하지 않는 문자의 조합으로 특수문자를 표기하는 방법. 문자 2개의 조합이면 digraph, 3개면 trigraph. 유니코드가 대세가 된 지금은 사실 필요 없고, 옛날 소스라고 해도 간단한 일괄 변환작업으로 새 표준에 맞출 수 있기도 하다. 다만 표준에서 삭제처리를 할 경우 해당 문법이 다른 기능으로 대체될 수 있기 때문에 일괄변환이 언제나 될 것이라는 보증이 안 되고, 후술하는 IBM 등 장기간의 낡은 코드와 관련된 이해관계자들 입장에서 떨떠름한 것은 사실이다.[12] 객체의 복사에서 원본이 불필요한 경우 이를 활용하면 실행 시간 감소의 효과가 있다. 복사 생성자를 통해 깊은 복사를 수행하는 대신에 원본의 내용을 원하는 메모리에 그대로 전달한다.[13] 반복자 대신 이를 대신 사용함으로써 반복문을 간략하게 작성할 수 있다.[14] 기존 표준의 유일한 스마트 포인터였던 std::auto_ptr
은 명시적이지 않은 소유권 이동, 동적 배열의 삭제 불가 등 실무에서 절대 사용하면 안되는 쓰레기였지만, std::shared_ptr
와 같은 새로운 스마트 포인터가 추가되면서 메모리 관리가 보다 안전해지고 편해졌다. 스마트 포인터를 잘 활용한다면 메모리 관리에 대한 수고를 덜 수 있다. 실제로 Chromium과 같은 대규모 프로젝트에서 심심치 않게 볼 수 있다.[15] 다만, 속도가 Python보다도 1.5배나 느리다. 컴파일러들의 구현이 좋지 않거나 운영체제의 메모리 할당이 너무 잦기 때문으로 보인다. 자주 사용한다면 별도의 라이브러리를 사용할 것을 추천한다.[16] C++뿐 아니라 C, 파스칼 등 클래식 언어들이 전부 ISO에서 표준화되고 있다. 아예 이런 언어를 표준화하는 전문 태스크 팀 JTC1/SC22라는 게 있으며, 이중 C++는 21번째 그룹에 속한다.