Contents List of Tables List of Figures 1 General 1.1 Scope 1.2 Normative references 1.3 Terms and definitions 1.4 Implementation compliance 1.5 Structure of this International Standard 1.6 Syntax notation 1.7 The C++ memory model 1.8 The C++ object model 1.9 Program execution 1.10 Multi-threaded executions and data races 1.11 Acknowledgments 2 Lexical conventions 2.1 Separate translation 2.2 Phases of translation 2.3 Character sets 2.4 Trigraph sequences 2.5 Preprocessing tokens 2.6 Alternative tokens 2.7 Tokens 2.8 Comments 2.9 Header names 2.10 Preprocessing numbers 2.11 Identifiers 2.12 Keywords 2.13 Operators and punctuators 2.14 Literals 2.14.1 Kinds of literals 2.14.2 Integer literals 2.14.3 Character literals 2.14.4 Floating literals 2.14.5 String literals 2.14.6 Boolean literals 2.14.7 Pointer literals 2.14.8 User-defined literals 3 Basic concepts 3.1 Declarations and definitions 3.2 One definition rule 3.3 Scope 3.3.1 Declarative regions and scopes 3.3.2 Point of declaration 3.3.3 Block scope 3.3.4 Function prototype scope 3.3.5 Function scope 3.3.6 Namespace scope 3.3.7 Class scope 3.3.8 Enumeration scope 3.3.9 Template parameter scope 3.3.10 Name hiding 3.4 Name lookup 3.4.1 Unqualified name lookup 3.4.2 Argument-dependent name lookup 3.4.3 Qualified name lookup 3.4.3.1 Class members 3.4.3.2 Namespace members 3.4.4 Elaborated type specifiers 3.4.5 Class member access 3.4.6 Using-directives and namespace aliases 3.5 Program and linkage 3.6 Start and termination 3.6.1 Main function 3.6.2 Initialization of non-local variables 3.6.3 Termination 3.7 Storage duration 3.7.1 Static storage duration 3.7.2 Thread storage duration 3.7.3 Automatic storage duration 3.7.4 Dynamic storage duration 3.7.4.1 Allocation functions 3.7.4.2 Deallocation functions 3.7.4.3 Safely-derived pointers 3.7.5 Duration of subobjects 3.8 Object lifetime 3.9 Types 3.9.1 Fundamental types 3.9.2 Compound types 3.9.3 CV-qualifiers 3.10 Lvalues and rvalues 3.11 Alignment 4 Standard conversions 4.1 Lvalue-to-rvalue conversion 4.2 Array-to-pointer conversion 4.3 Function-to-pointer conversion 4.4 Qualification conversions 4.5 Integral promotions 4.6 Floating point promotion 4.7 Integral conversions 4.8 Floating point conversions 4.9 Floating-integral conversions 4.10 Pointer conversions 4.11 Pointer to member conversions 4.12 Boolean conversions 4.13 Integer conversion rank 5 Expressions 5.1 Primary expressions 5.1.1 General 5.1.2 Lambda expressions 5.2 Postfix expressions 5.2.1 Subscripting 5.2.2 Function call 5.2.3 Explicit type conversion (functional notation) 5.2.4 Pseudo destructor call 5.2.5 Class member access 5.2.6 Increment and decrement 5.2.7 Dynamic cast 5.2.8 Type identification 5.2.9 Static cast 5.2.10 Reinterpret cast 5.2.11 Const cast 5.3 Unary expressions 5.3.1 Unary operators 5.3.2 Increment and decrement 5.3.3 Sizeof 5.3.4 New 5.3.5 Delete 5.3.6 Alignof 5.3.7 noexcept operator 5.4 Explicit type conversion (cast notation) 5.5 Pointer-to-member operators 5.6 Multiplicative operators 5.7 Additive operators 5.8 Shift operators 5.9 Relational operators 5.10 Equality operators 5.11 Bitwise AND operator 5.12 Bitwise exclusive OR operator 5.13 Bitwise inclusive OR operator 5.14 Logical AND operator 5.15 Logical OR operator 5.16 Conditional operator 5.17 Assignment and compound assignment operators 5.18 Comma operator 5.19 Constant expressions 6 Statements 6.1 Labeled statement 6.2 Expression statement 6.3 Compound statement or block 6.4 Selection statements 6.4.1 The if statement 6.4.2 The switch statement 6.5 Iteration statements 6.5.1 The while statement 6.5.2 The do statement 6.5.3 The for statement 6.5.4 The range-based for statement 6.6 Jump statements 6.6.1 The break statement 6.6.2 The continue statement 6.6.3 The return statement 6.6.4 The goto statement 6.7 Declaration statement 6.8 Ambiguity resolution 7 Declarations 7.1 Specifiers 7.1.1 Storage class specifiers 7.1.2 Function specifiers 7.1.3 The typedef specifier 7.1.4 The friend specifier 7.1.5 The constexpr specifier 7.1.6 Type specifiers 7.1.6.1 The cv-qualifiers 7.1.6.2 Simple type specifiers 7.1.6.3 Elaborated type specifiers 7.1.6.4 auto specifier 7.2 Enumeration declarations 7.3 Namespaces 7.3.1 Namespace definition 7.3.1.1 Unnamed namespaces 7.3.1.2 Namespace member definitions 7.3.2 Namespace alias 7.3.3 The using declaration 7.3.4 Using directive 7.4 The asm declaration 7.5 Linkage specifications 7.6 Attributes 7.6.1 Attribute syntax and semantics 7.6.2 Alignment specifier 7.6.3 Noreturn attribute 7.6.4 Carries dependency attribute 8 Declarators 8.1 Type names 8.2 Ambiguity resolution 8.3 Meaning of declarators 8.3.1 Pointers 8.3.2 References 8.3.3 Pointers to members 8.3.4 Arrays 8.3.5 Functions 8.3.6 Default arguments 8.4 Function definitions 8.4.1 In general 8.4.2 Explicitly-defaulted functions 8.4.3 Deleted definitions 8.5 Initializers 8.5.1 Aggregates 8.5.2 Character arrays 8.5.3 References 8.5.4 List-initialization 9 Classes 9.1 Class names 9.2 Class members 9.3 Member functions 9.3.1 Nonstatic member functions 9.3.2 The this pointer 9.4 Static members 9.4.1 Static member functions 9.4.2 Static data members 9.5 Unions 9.6 Bit-fields 9.7 Nested class declarations 9.8 Local class declarations 9.9 Nested type names 10 Derived classes 10.1 Multiple base classes 10.2 Member name lookup 10.3 Virtual functions 10.4 Abstract classes 11 Member access control 11.1 Access specifiers 11.2 Accessibility of base classes and base class members 11.3 Friends 11.4 Protected member access 11.5 Access to virtual functions 11.6 Multiple access 11.7 Nested classes 12 Special member functions 12.1 Constructors 12.2 Temporary objects 12.3 Conversions 12.3.1 Conversion by constructor 12.3.2 Conversion functions 12.4 Destructors 12.5 Free store 12.6 Initialization 12.6.1 Explicit initialization 12.6.2 Initializing bases and members 12.7 Construction and destruction 12.8 Copying and moving class objects 12.9 Inheriting constructors 13 Overloading 13.1 Overloadable declarations 13.2 Declaration matching 13.3 Overload resolution 13.3.1 Candidate functions and argument lists 13.3.1.1 Function call syntax 13.3.1.1.1 Call to named function 13.3.1.1.2 Call to object of class type 13.3.1.2 Operators in expressions 13.3.1.3 Initialization by constructor 13.3.1.4 Copy-initialization of class by user-defined conversion 13.3.1.5 Initialization by conversion function 13.3.1.6 Initialization by conversion function for direct reference binding 13.3.1.7 Initialization by list-initialization 13.3.2 Viable functions 13.3.3 Best viable function 13.3.3.1 Implicit conversion sequences 13.3.3.1.1 Standard conversion sequences 13.3.3.1.2 User-defined conversion sequences 13.3.3.1.3 Ellipsis conversion sequences 13.3.3.1.4 Reference binding 13.3.3.1.5 List-initialization sequence 13.3.3.2 Ranking implicit conversion sequences 13.4 Address of overloaded function 13.5 Overloaded operators 13.5.1 Unary operators 13.5.2 Binary operators 13.5.3 Assignment 13.5.4 Function call 13.5.5 Subscripting 13.5.6 Class member access 13.5.7 Increment and decrement 13.5.8 User-defined literals 13.6 Built-in operators 14 Templates 14.1 Template parameters 14.2 Names of template specializations 14.3 Template arguments 14.3.1 Template type arguments 14.3.2 Template non-type arguments 14.3.3 Template template arguments 14.4 Type equivalence 14.5 Template declarations 14.5.1 Class templates 14.5.1.1 Member functions of class templates 14.5.1.2 Member classes of class templates 14.5.1.3 Static data members of class templates 14.5.1.4 Enumeration members of class templates 14.5.2 Member templates 14.5.3 Variadic templates 14.5.4 Friends 14.5.5 Class template partial specializations 14.5.5.1 Matching of class template partial specializations 14.5.5.2 Partial ordering of class template specializations 14.5.5.3 Members of class template specializations 14.5.6 Function templates 14.5.6.1 Function template overloading 14.5.6.2 Partial ordering of function templates 14.5.7 Alias templates 14.6 Name resolution 14.6.1 Locally declared names 14.6.2 Dependent names 14.6.2.1 Dependent types 14.6.2.2 Type-dependent expressions 14.6.2.3 Value-dependent expressions 14.6.2.4 Dependent template arguments 14.6.3 Non-dependent names 14.6.4 Dependent name resolution 14.6.4.1 Point of instantiation 14.6.4.2 Candidate functions 14.6.5 Friend names declared within a class template 14.7 Template instantiation and specialization 14.7.1 Implicit instantiation 14.7.2 Explicit instantiation 14.7.3 Explicit specialization 14.8 Function template specializations 14.8.1 Explicit template argument specification 14.8.2 Template argument deduction 14.8.2.1 Deducing template arguments from a function call 14.8.2.2 Deducing template arguments taking the address of a function template 14.8.2.3 Deducing conversion function template arguments 14.8.2.4 Deducing template arguments during partial ordering 14.8.2.5 Deducing template arguments from a type 14.8.2.6 Deducing template arguments from a function declaration 14.8.3 Overload resolution 15 Exception handling 15.1 Throwing an exception 15.2 Constructors and destructors 15.3 Handling an exception 15.4 Exception specifications 15.5 Special functions 15.5.1 The std::terminate() function 15.5.2 The std::unexpected() function 15.5.3 The std::uncaught_exception() function 16 Preprocessing directives 16.1 Conditional inclusion 16.2 Source file inclusion 16.3 Macro replacement 16.3.1 Argument substitution 16.3.2 The # operator 16.3.3 The ## operator 16.3.4 Rescanning and further replacement 16.3.5 Scope of macro definitions 16.4 Line control 16.5 Error directive 16.6 Pragma directive 16.7 Null directive 16.8 Predefined macro names 16.9 Pragma operator 17 Library introduction 17.1 General 17.2 The C standard library 17.3 Definitions 17.4 Additional definitions 17.5 Method of description (Informative) 17.5.1 Structure of each clause 17.5.1.1 Elements 17.5.1.2 Summary 17.5.1.3 Requirements 17.5.1.4 Detailed specifications 17.5.1.5 C library 17.5.2 Other conventions 17.5.2.1 Type descriptions 17.5.2.1.1 General 17.5.2.1.2 Enumerated types 17.5.2.1.3 Bitmask types 17.5.2.1.4 Character sequences 17.5.2.1.4.1 Byte strings 17.5.2.1.4.2 Multibyte strings 17.5.2.2 Functions within classes 17.5.2.3 Private members 17.6 Library-wide requirements 17.6.1 Library contents and organization 17.6.1.1 Library contents 17.6.1.2 Headers 17.6.1.3 Freestanding implementations 17.6.2 Using the library 17.6.2.1 Overview 17.6.2.2 Headers 17.6.2.3 Linkage 17.6.3 Requirements on types and expressions 17.6.3.1 Template argument requirements 17.6.3.2 Swappable requirements 17.6.3.3 NullablePointer requirements 17.6.3.4 Hash requirements 17.6.3.5 Allocator requirements 17.6.4 Constraints on programs 17.6.4.1 Overview 17.6.4.2 Namespace use 17.6.4.2.1 Namespace std 17.6.4.2.2 Namespace posix 17.6.4.3 Reserved names 17.6.4.3.1 Macro names 17.6.4.3.2 Global names 17.6.4.3.3 External linkage 17.6.4.3.4 Types 17.6.4.3.5 User-defined literal suffixes 17.6.4.4 Headers 17.6.4.5 Derived classes 17.6.4.6 Replacement functions 17.6.4.7 Handler functions 17.6.4.8 Other functions 17.6.4.9 Function arguments 17.6.4.10 Shared objects and the library 17.6.4.11 Requires paragraph 17.6.5 Conforming implementations 17.6.5.1 Overview 17.6.5.2 Headers 17.6.5.3 Restrictions on macro definitions 17.6.5.4 Global and non-member functions 17.6.5.5 Member functions 17.6.5.6 constexpr functions and constructors 17.6.5.7 Requirements for stable algorithms 17.6.5.8 Reentrancy 17.6.5.9 Data race avoidance 17.6.5.10 Protection within classes 17.6.5.11 Derived classes 17.6.5.12 Restrictions on exception handling 17.6.5.13 Restrictions on storage of pointers 17.6.5.14 Value of error codes 17.6.5.15 Moved-from state of library types 18 Language support library 18.1 General 18.2 Types 18.3 Implementation properties 18.3.1 In general 18.3.2 Numeric limits 18.3.2.1 Class template numeric_limits 18.3.2.2 Header synopsis 18.3.2.3 Class template numeric_limits 18.3.2.4 numeric_limits members 18.3.2.5 Type float_round_style 18.3.2.6 Type float_denorm_style 18.3.2.7 numeric_limits specializations 18.3.3 C library 18.4 Integer types 18.4.1 Header synopsis 18.5 Start and termination 18.6 Dynamic memory management 18.6.1 Storage allocation and deallocation 18.6.1.1 Single-object forms 18.6.1.2 Array forms 18.6.1.3 Placement forms 18.6.1.4 Data races 18.6.2 Storage allocation errors 18.6.2.1 Class bad_alloc 18.6.2.2 Class bad_array_new_length 18.6.2.3 Type new_handler 18.6.2.4 set_new_handler 18.6.2.5 get_new_handler 18.7 Type identification 18.7.1 Class type_info 18.7.2 Class bad_cast 18.7.3 Class bad_typeid 18.8 Exception handling 18.8.1 Class exception 18.8.2 Class bad_exception 18.8.3 Abnormal termination 18.8.3.1 Type terminate_handler 18.8.3.2 set_terminate 18.8.3.3 get_terminate 18.8.3.4 terminate 18.8.4 uncaught_exception 18.8.5 Exception propagation 18.8.6 nested_exception 18.9 Initializer lists 18.9.1 Initializer list constructors 18.9.2 Initializer list access 18.9.3 Initializer list range access 18.10 Other runtime support 19 Diagnostics library 19.1 General 19.2 Exception classes 19.2.1 Class logic_error 19.2.2 Class domain_error 19.2.3 Class invalid_argument 19.2.4 Class length_error 19.2.5 Class out_of_range 19.2.6 Class runtime_error 19.2.7 Class range_error 19.2.8 Class overflow_error 19.2.9 Class underflow_error 19.3 Assertions 19.4 Error numbers 19.5 System error support 19.5.1 Class error_category 19.5.1.1 Class error_category overview 19.5.1.2 Class error_category virtual members 19.5.1.3 Class error_category non-virtual members 19.5.1.4 Program defined classes derived from error_category 19.5.1.5 Error category objects 19.5.2 Class error_code 19.5.2.1 Class error_code overview 19.5.2.2 Class error_code constructors 19.5.2.3 Class error_code modifiers 19.5.2.4 Class error_code observers 19.5.2.5 Class error_code non-member functions 19.5.3 Class error_condition 19.5.3.1 Class error_condition overview 19.5.3.2 Class error_condition constructors 19.5.3.3 Class error_condition modifiers 19.5.3.4 Class error_condition observers 19.5.3.5 Class error_condition non-member functions 19.5.4 Comparison operators 19.5.5 System error hash support 19.5.6 Class system_error 19.5.6.1 Class system_error overview 19.5.6.2 Class system_error members 20 General utilities library 20.1 General 20.2 Utility components 20.2.1 Operators 20.2.2 swap 20.2.3 forward/move helpers 20.2.4 Function template declval 20.3 Pairs 20.3.1 In general 20.3.2 Class template pair 20.3.3 Specialized algorithms 20.3.4 Tuple-like access to pair 20.3.5 Piecewise construction 20.4 Tuples 20.4.1 In general 20.4.2 Class template tuple 20.4.2.1 Construction 20.4.2.2 Assignment 20.4.2.3 swap 20.4.2.4 Tuple creation functions 20.4.2.5 Tuple helper classes 20.4.2.6 Element access 20.4.2.7 Relational operators 20.4.2.8 Tuple traits 20.4.2.9 Tuple specialized algorithms 20.5 Class template bitset 20.5.1 bitset constructors 20.5.2 bitset members 20.5.3 bitset hash support 20.5.4 bitset operators 20.6 Memory 20.6.1 In general 20.6.2 Header synopsis 20.6.3 Pointer traits 20.6.3.1 Pointer traits member types 20.6.3.2 Pointer traits member functions 20.6.4 Pointer safety 20.6.5 Align 20.6.6 Allocator argument tag 20.6.7 uses_allocator 20.6.7.1 uses_allocator trait 20.6.7.2 uses-allocator construction 20.6.8 Allocator traits 20.6.8.1 Allocator traits member types 20.6.8.2 Allocator traits static member functions 20.6.9 The default allocator 20.6.9.1 allocator members 20.6.9.2 allocator globals 20.6.10 Raw storage iterator 20.6.11 Temporary buffers 20.6.12 Specialized algorithms 20.6.12.1 addressof 20.6.12.2 uninitialized_copy 20.6.12.3 uninitialized_fill 20.6.12.4 uninitialized_fill_n 20.6.13 C library 20.7 Smart pointers 20.7.1 Class template unique_ptr 20.7.1.1 Default deleters 20.7.1.1.1 In general 20.7.1.1.2 default_delete 20.7.1.1.3 default_delete 20.7.1.2 unique_ptr for single objects 20.7.1.2.1 unique_ptr constructors 20.7.1.2.2 unique_ptr destructor 20.7.1.2.3 unique_ptr assignment 20.7.1.2.4 unique_ptr observers 20.7.1.2.5 unique_ptr modifiers 20.7.1.3 unique_ptr for array objects with a runtime length 20.7.1.3.1 unique_ptr constructors 20.7.1.3.2 unique_ptr observers 20.7.1.3.3 unique_ptr modifiers 20.7.1.4 unique_ptr specialized algorithms 20.7.2 Shared-ownership pointers 20.7.2.1 Class bad_weak_ptr 20.7.2.2 Class template shared_ptr 20.7.2.2.1 shared_ptr constructors 20.7.2.2.2 shared_ptr destructor 20.7.2.2.3 shared_ptr assignment 20.7.2.2.4 shared_ptr modifiers 20.7.2.2.5 shared_ptr observers 20.7.2.2.6 shared_ptr creation 20.7.2.2.7 shared_ptr comparison 20.7.2.2.8 shared_ptr specialized algorithms 20.7.2.2.9 shared_ptr casts 20.7.2.2.10 get_deleter 20.7.2.2.11 shared_ptr I/O 20.7.2.3 Class template weak_ptr 20.7.2.3.1 weak_ptr constructors 20.7.2.3.2 weak_ptr destructor 20.7.2.3.3 weak_ptr assignment 20.7.2.3.4 weak_ptr modifiers 20.7.2.3.5 weak_ptr observers 20.7.2.3.6 weak_ptr specialized algorithms 20.7.2.3.7 Class template owner_less 20.7.2.4 Class template enable_shared_from_this 20.7.2.5 shared_ptr atomic access 20.7.2.6 Smart pointer hash support 20.8 Function objects 20.8.1 Definitions 20.8.2 Requirements 20.8.3 Class template reference_wrapper 20.8.3.1 reference_wrapper construct/copy/destroy 20.8.3.2 reference_wrapper assignment 20.8.3.3 reference_wrapper access 20.8.3.4 reference_wrapper invocation 20.8.3.5 reference_wrapper helper functions 20.8.4 Arithmetic operations 20.8.5 Comparisons 20.8.6 Logical operations 20.8.7 Bitwise operations 20.8.8 Negators 20.8.9 Function template bind 20.8.9.1 Function object binders 20.8.9.1.1 Class template is_bind_expression 20.8.9.1.2 Function template bind 20.8.9.1.3 Placeholders 20.8.10 Function template mem_fn 20.8.11 Polymorphic function wrappers 20.8.11.1 Class bad_function_call 20.8.11.1.1 bad_function_call constructor 20.8.11.2 Class template function 20.8.11.2.1 function construct/copy/destroy 20.8.11.2.2 function modifiers 20.8.11.2.3 function capacity 20.8.11.2.4 function invocation 20.8.11.2.5 function target access 20.8.11.2.6 null pointer comparison operators 20.8.11.2.7 specialized algorithms 20.8.12 Class template hash 20.9 Metaprogramming and type traits 20.9.1 Requirements 20.9.2 Header synopsis 20.9.3 Helper classes 20.9.4 Unary type traits 20.9.4.1 Primary type categories 20.9.4.2 Composite type traits 20.9.4.3 Type properties 20.9.5 Type property queries 20.9.6 Relationships between types 20.9.7 Transformations between types 20.9.7.1 Const-volatile modifications 20.9.7.2 Reference modifications 20.9.7.3 Sign modifications 20.9.7.4 Array modifications 20.9.7.5 Pointer modifications 20.9.7.6 Other transformations 20.10 Compile-time rational arithmetic 20.10.1 In general 20.10.2 Header synopsis 20.10.3 Class template ratio 20.10.4 Arithmetic on ratios 20.10.5 Comparison of ratios 20.10.6 SI types for ratio 20.11 Time utilities 20.11.1 In general 20.11.2 Header synopsis 20.11.3 Clock requirements 20.11.4 Time-related traits 20.11.4.1 treat_as_floating_point 20.11.4.2 duration_values 20.11.4.3 Specializations of common_type 20.11.5 Class template duration 20.11.5.1 duration constructors 20.11.5.2 duration observer 20.11.5.3 duration arithmetic 20.11.5.4 duration special values 20.11.5.5 duration non-member arithmetic 20.11.5.6 duration comparisons 20.11.5.7 duration_cast 20.11.6 Class template time_point 20.11.6.1 time_point constructors 20.11.6.2 time_point observer 20.11.6.3 time_point arithmetic 20.11.6.4 time_point special values 20.11.6.5 time_point non-member arithmetic 20.11.6.6 time_point comparisons 20.11.6.7 time_point_cast 20.11.7 Clocks 20.11.7.1 Class system_clock 20.11.7.2 Class steady_clock 20.11.7.3 Class high_resolution_clock 20.11.8 Date and time functions 20.12 Class template scoped_allocator_adaptor 20.12.1 Header synopsis 20.12.2 Scoped allocator adaptor member types 20.12.3 Scoped allocator adaptor constructors 20.12.4 Scoped allocator adaptor members 20.12.5 Scoped allocator operators 20.13 Class type_index 20.13.1 Header synopsis 20.13.2 type_index overview 20.13.3 type_index members 20.13.4 Hash support 21 Strings library 21.1 General 21.2 Character traits 21.2.1 Character traits requirements 21.2.2 traits typedefs 21.2.3 char_traits specializations 21.2.3.1 struct char_traits 21.2.3.2 struct char_traits 21.2.3.3 struct char_traits 21.2.3.4 struct char_traits 21.3 String classes 21.4 Class template basic_string 21.4.1 basic_string general requirements 21.4.2 basic_string constructors and assignment operators 21.4.3 basic_string iterator support 21.4.4 basic_string capacity 21.4.5 basic_string element access 21.4.6 basic_string modifiers 21.4.6.1 basic_string::operator+= 21.4.6.2 basic_string::append 21.4.6.3 basic_string::assign 21.4.6.4 basic_string::insert 21.4.6.5 basic_string::erase 21.4.6.6 basic_string::replace 21.4.6.7 basic_string::copy 21.4.6.8 basic_string::swap 21.4.7 basic_string string operations 21.4.7.1 basic_string accessors 21.4.7.2 basic_string::find 21.4.7.3 basic_string::rfind 21.4.7.4 basic_string::find_first_of 21.4.7.5 basic_string::find_last_of 21.4.7.6 basic_string::find_first_not_of 21.4.7.7 basic_string::find_last_not_of 21.4.7.8 basic_string::substr 21.4.7.9 basic_string::compare 21.4.8 basic_string non-member functions 21.4.8.1 operator+ 21.4.8.2 operator== 21.4.8.3 operator!= 21.4.8.4 operator 21.4.8.6 operator = 21.4.8.8 swap 21.4.8.9 Inserters and extractors 21.5 Numeric conversions 21.6 Hash support 21.7 Null-terminated sequence utilities 22 Localization library 22.1 General 22.2 Header synopsis 22.3 Locales 22.3.1 Class locale 22.3.1.1 locale types 22.3.1.1.1 Type locale::category 22.3.1.1.2 Class locale::facet 22.3.1.1.3 Class locale::id 22.3.1.2 locale constructors and destructor 22.3.1.3 locale members 22.3.1.4 locale operators 22.3.1.5 locale static members 22.3.2 locale globals 22.3.3 Convenience interfaces 22.3.3.1 Character classification 22.3.3.2 Conversions 22.3.3.2.1 Character conversions 22.3.3.2.2 string conversions 22.3.3.2.3 Buffer conversions 22.4 Standard locale categories 22.4.1 The ctype category 22.4.1.1 Class template ctype 22.4.1.1.1 ctype members 22.4.1.1.2 ctype virtual functions 22.4.1.2 Class template ctype_byname 22.4.1.3 ctype specializations 22.4.1.3.1 ctype destructor 22.4.1.3.2 ctype members 22.4.1.3.3 ctype static members 22.4.1.3.4 ctype virtual functions 22.4.1.4 Class template codecvt 22.4.1.4.1 codecvt members 22.4.1.4.2 codecvt virtual functions 22.4.1.5 Class template codecvt_byname 22.4.2 The numeric category 22.4.2.1 Class template num_get 22.4.2.1.1 num_get members 22.4.2.1.2 num_get virtual functions 22.4.2.2 Class template num_put 22.4.2.2.1 num_put members 22.4.2.2.2 num_put virtual functions 22.4.3 The numeric punctuation facet 22.4.3.1 Class template numpunct 22.4.3.1.1 numpunct members 22.4.3.1.2 numpunct virtual functions 22.4.3.2 Class template numpunct_byname 22.4.4 The collate category 22.4.4.1 Class template collate 22.4.4.1.1 collate members 22.4.4.1.2 collate virtual functions 22.4.4.2 Class template collate_byname 22.4.5 The time category 22.4.5.1 Class template time_get 22.4.5.1.1 time_get members 22.4.5.1.2 time_get virtual functions 22.4.5.2 Class template time_get_byname 22.4.5.3 Class template time_put 22.4.5.3.1 time_put members 22.4.5.3.2 time_put virtual functions 22.4.5.4 Class template time_put_byname 22.4.6 The monetary category 22.4.6.1 Class template money_get 22.4.6.1.1 money_get members 22.4.6.1.2 money_get virtual functions 22.4.6.2 Class template money_put 22.4.6.2.1 money_put members 22.4.6.2.2 money_put virtual functions 22.4.6.3 Class template moneypunct 22.4.6.3.1 moneypunct members 22.4.6.3.2 moneypunct virtual functions 22.4.6.4 Class template moneypunct_byname 22.4.7 The message retrieval category 22.4.7.1 Class template messages 22.4.7.1.1 messages members 22.4.7.1.2 messages virtual functions 22.4.7.2 Class template messages_byname 22.4.8 Program-defined facets 22.5 Standard code conversion facets 22.6 C library locales 23 Containers library 23.1 General 23.2 Container requirements 23.2.1 General container requirements 23.2.2 Container data races 23.2.3 Sequence containers 23.2.4 Associative containers 23.2.4.1 Exception safety guarantees 23.2.5 Unordered associative containers 23.2.5.1 Exception safety guarantees 23.3 Sequence containers 23.3.1 In general 23.3.2 Class template array 23.3.2.1 Class template array overview 23.3.2.2 array constructors, copy, and assignment 23.3.2.3 array specialized algorithms 23.3.2.4 array::size 23.3.2.5 array::data 23.3.2.6 array::fill 23.3.2.7 array::swap 23.3.2.8 Zero sized arrays 23.3.2.9 Tuple interface to class template array 23.3.3 Class template deque 23.3.3.1 Class template deque overview 23.3.3.2 deque constructors, copy, and assignment 23.3.3.3 deque capacity 23.3.3.4 deque modifiers 23.3.3.5 deque specialized algorithms 23.3.4 Class template forward_list 23.3.4.1 Class template forward_list overview 23.3.4.2 forward_list constructors, copy, assignment 23.3.4.3 forward_list iterators 23.3.4.4 forward_list element access 23.3.4.5 forward_list modifiers 23.3.4.6 forward_list operations 23.3.4.7 forward_list specialized algorithms 23.3.5 Class template list 23.3.5.1 Class template list overview 23.3.5.2 list constructors, copy, and assignment 23.3.5.3 list capacity 23.3.5.4 list modifiers 23.3.5.5 list operations 23.3.5.6 list specialized algorithms 23.3.6 Class template vector 23.3.6.1 Class template vector overview 23.3.6.2 vector constructors, copy, and assignment 23.3.6.3 vector capacity 23.3.6.4 vector data 23.3.6.5 vector modifiers 23.3.6.6 vector specialized algorithms 23.3.7 Class vector 23.4 Associative containers 23.4.1 In general 23.4.2 Header synopsis 23.4.3 Header synopsis 23.4.4 Class template map 23.4.4.1 Class template map overview 23.4.4.2 map constructors, copy, and assignment 23.4.4.3 map element access 23.4.4.4 map modifiers 23.4.4.5 map operations 23.4.4.6 map specialized algorithms 23.4.5 Class template multimap 23.4.5.1 Class template multimap overview 23.4.5.2 multimap constructors 23.4.5.3 multimap modifiers 23.4.5.4 multimap operations 23.4.5.5 multimap specialized algorithms 23.4.6 Class template set 23.4.6.1 Class template set overview 23.4.6.2 set constructors, copy, and assignment 23.4.6.3 set specialized algorithms 23.4.7 Class template multiset 23.4.7.1 Class template multiset overview 23.4.7.2 multiset constructors 23.4.7.3 multiset specialized algorithms 23.5 Unordered associative containers 23.5.1 In general 23.5.2 Header synopsis 23.5.3 Header synopsis 23.5.4 Class template unordered_map 23.5.4.1 Class template unordered_map overview 23.5.4.2 unordered_map constructors 23.5.4.3 unordered_map element access 23.5.4.4 unordered_map modifiers 23.5.4.5 unordered_map swap 23.5.5 Class template unordered_multimap 23.5.5.1 Class template unordered_multimap overview 23.5.5.2 unordered_multimap constructors 23.5.5.3 unordered_multimap modifiers 23.5.5.4 unordered_multimap swap 23.5.6 Class template unordered_set 23.5.6.1 Class template unordered_set overview 23.5.6.2 unordered_set constructors 23.5.6.3 unordered_set swap 23.5.7 Class template unordered_multiset 23.5.7.1 Class template unordered_multiset overview 23.5.7.2 unordered_multiset constructors 23.5.7.3 unordered_multiset swap 23.6 Container adaptors 23.6.1 In general 23.6.2 Header synopsis 23.6.3 Class template queue 23.6.3.1 queue definition 23.6.3.2 queue constructors 23.6.3.3 queue constructors with allocators 23.6.3.4 queue operators 23.6.3.5 queue specialized algorithms 23.6.4 Class template priority_queue 23.6.4.1 priority_queue constructors 23.6.4.2 priority_queue constructors with allocators 23.6.4.3 priority_queue members 23.6.4.4 priority_queue specialized algorithms 23.6.5 Class template stack 23.6.5.1 Header synopsis 23.6.5.2 stack definition 23.6.5.3 stack constructors 23.6.5.4 stack constructors with allocators 23.6.5.5 stack operators 23.6.5.6 stack specialized algorithms 24 Iterators library 24.1 General 24.2 Iterator requirements 24.2.1 In general 24.2.2 Iterator 24.2.3 Input iterators 24.2.4 Output iterators 24.2.5 Forward iterators 24.2.6 Bidirectional iterators 24.2.7 Random access iterators 24.3 Header synopsis 24.4 Iterator primitives 24.4.1 Iterator traits 24.4.2 Basic iterator 24.4.3 Standard iterator tags 24.4.4 Iterator operations 24.5 Iterator adaptors 24.5.1 Reverse iterators 24.5.1.1 Class template reverse_iterator 24.5.1.2 reverse_iterator requirements 24.5.1.3 reverse_iterator operations 24.5.1.3.1 reverse_iterator constructor 24.5.1.3.2 reverse_iterator::operator= 24.5.1.3.3 Conversion 24.5.1.3.4 operator* 24.5.1.3.5 operator-> 24.5.1.3.6 operator++ 24.5.1.3.7 operator-- 24.5.1.3.8 operator+ 24.5.1.3.9 operator+= 24.5.1.3.10 operator- 24.5.1.3.11 operator-= 24.5.1.3.12 operator[] 24.5.1.3.13 operator== 24.5.1.3.14 operator 24.5.1.3.17 operator>= 24.5.1.3.18 operator 24.5.3.3.6 move_iterator::operator++ 24.5.3.3.7 move_iterator::operator-- 24.5.3.3.8 move_iterator::operator+ 24.5.3.3.9 move_iterator::operator+= 24.5.3.3.10 move_iterator::operator- 24.5.3.3.11 move_iterator::operator-= 24.5.3.3.12 move_iterator::operator[] 24.5.3.3.13 move_iterator comparisons 24.5.3.3.14 move_iterator non-member functions 24.6 Stream iterators 24.6.1 Class template istream_iterator 24.6.1.1 istream_iterator constructors and destructor 24.6.1.2 istream_iterator operations 24.6.2 Class template ostream_iterator 24.6.2.1 ostream_iterator constructors and destructor 24.6.2.2 ostream_iterator operations 24.6.3 Class template istreambuf_iterator 24.6.3.1 Class template istreambuf_iterator::proxy 24.6.3.2 istreambuf_iterator constructors 24.6.3.3 istreambuf_iterator::operator* 24.6.3.4 istreambuf_iterator::operator++ 24.6.3.5 istreambuf_iterator::equal 24.6.3.6 operator== 24.6.3.7 operator!= 24.6.4 Class template ostreambuf_iterator 24.6.4.1 ostreambuf_ite