# C++ 1998/2003

ISO C++ 1998

## Implementation Status

This status table is based on the table of contents of ISO/IEC 14882:2003.

This page describes the C++ support in mainline GCC SVN, not in any particular release.

C++ 1998/2003 Implementation Status

Section | Description | Status | Comments
--- | --- | --- | ---
18 | Language support
18.1 | Types | Y |
18.2 | Implementation properties | Y |
18.2.1 | Numeric Limits |  |
18.2.1.1 | Class template `numeric_limits` | Y |
18.2.1.2 | `numeric_limits` members | Y
18.2.1.3 | `float_round_style` | Y
18.2.1.4 | `float_denorm_style` | Y
18.2.1.5 | `numeric_limits` specializations | Y |
18.2.2 | C Library | Y |
18.3 | Start and termination | Y |
18.4 | Dynamic memory management | Y |
18.5 | Type identification |  |
18.5.1 | Class type_info | Y |
18.5.2 | Class bad_cast | Y |
18.5.3 | Class bad_typeid | Y |
18.6 | Exception handling |  |
18.6.1 | Class exception | Y |
18.6.2 | Violation exception-specifications | Y |
18.6.3 | Abnormal termination | Y |
18.6.4 | `uncaught_exception` | Y |
18.7 | Other runtime support | Y |
19 | Diagnostics
19.1 | Exception classes | Y |
19.2 | Assertions | Y |
19.3 | Error numbers | Y |
20 | General utilities
20.1 | Requirements | Y |
20.2 | Utility components |  |
20.2.1 | Operators | Y |
20.2.2 | `pair` | Y |
20.3 | Function objects |  |
20.3.1 | Base | Y |
20.3.2 | Arithmetic operation | Y |
20.3.3 | Comparisons | Y |
20.3.4 | Logical operations | Y |
20.3.5 | Negators | Y |
20.3.6 | Binders | Y |
20.3.7 | Adaptors for pointers to functions | Y |
20.3.8 | Adaptors for pointers to members | Y |
20.4 | Memory |  |
20.4.1 | The default allocator | Y |
20.4.2 | Raw storage iterator | Y |
20.4.3 | Temporary buffers | Y |
20.4.4 | Specialized algorithms | Y |
20.4.4.1 | `uninitialized_copy` | Y |
20.4.4.2 | `uninitialized_fill` | Y |
20.4.4.3 | `uninitialized_fill_n` | Y |
20.4.5 | Class template `auto_ptr` | Y |
20.4.6 | C library | Y |
21 | Strings
21.1 | Character traits |  |
21.1.1 | Character traits requirements | Y |
21.1.2 | traits typedef | Y |
21.1.3 | `char_traits` specializations |  |
21.1.3.1 | struct `char_traits<char>` | Y |
21.1.3.2 | struct `char_traits<wchar_t>` | Y |
21.2 | String classes | Y |
21.3 | Class template `basic_string` | Y |
21.4 | Null-terminated sequence utilities | Y | C library dependency
22 | Localization
22.1 | Locales |  |
22.1.1 | Class `locale` | Y |
22.1.2 | `locale` globals | Y |
22.1.3 | Convenience interfaces |  |
22.1.3.1 | Character classification | Y |
22.1.3.2 | Character conversions | Y |
22.2 | Standard locale categories |  |
22.2.1 | `ctype` | Y |
22.2.2 | Numeric |  |
22.2.2.1 | `num_get` | Y |
22.2.2.2 | `num_put` | Y |
22.2.3 | `num_punct` | Y |
22.2.4 | `collate` | Y |
22.2.5 | Time |  |
22.2.5.1 | `time_get` | Y |
22.2.5.2 | `time_get_byname` | Y |
22.2.5.3 | `time_put` | Y |
22.2.5.3 | `time_put_byname` | Y |
22.2.6 | Monetary |  |
22.2.6.1 | `money_get` | Y |
22.2.6.2 | `money_put` | Y |
22.2.6.3 | `money_punct` | Y |
22.2.6.4 | `money_punct_byname` | Y |
22.2.7 | `messages` | Y |
22.2.8 | Program-defined facets | Y |
22.3 | C Library Locales | Y |
23 | Containers
23.1 | Container requirements | Y |
23.2 | Sequence containers |  |
23.2.1 | Class template `deque` | Y |
23.2.2 | Class template `list` | Y |
23.2.3 | Adaptors |  |
23.2.3.1 | Class template `queue` | Y |
23.2.3.2 | Class template `priority_queue` | Y |
23.2.3.3 | Class template `stack` | Y |
23.2.4 | Class template `vector` | Y |
23.2.5 | Class `vector<bool>` | Y |
23.3 | Associative containers |  |
23.3.1 | Class template `map` | Y |
23.3.2 | Class template `multimap` | Y |
23.3.3 | Class template `set` | Y |
23.3.4 | Class template `multiset` | Y |
24 | Iterators
24.1 | Requirements | Y |
24.2 | Header `<iterator>` synopsis | Y |
24.3 | Iterator primitives | Y |
24.4 | Predefined iterators and Iterator adaptors |  |
24.4.1 | Reverse iterators | Y |
24.4.2 | Insert iterators | Y |
24.5 | Stream iterators |  |
24.5.1 | Class template `istream_iterator` | Y |
24.5.2 | Class template `ostream_iterator` | Y |
24.5.3 | Class template `istreambuf_iterator` | Y |
24.5.4 | Class template `ostreambuf_iterator` | Y |
25 | Algorithms
25.1 | Non-modifying sequence operations | Y |
25.2 | Mutating sequence operations | Y |
25.3 | Sorting and related operations | Y |
25.4 | C library algorithms | Y |
26 | Numerics
26.1 | Numeric type requirements | Y |
26.2 | Complex numbers | Y |
26.3 | Numeric arrays |  |
26.3.1 | Header `<valarray>` synopsis | Y |
26.3.2 | Class template `valarray` | Y |
26.3.3 | `valarray` non-member operations | Y |
26.3.4 | Class `slice` | Y |
26.3.5 | Class template `slice_array` | Y |
26.3.6 | Class `gslice` | Y |
26.3.7 | Class template `gslice_array` | Y |
26.3.8 | Class template `mask_array` | Y |
26.3.9 | Class template `indirect_array` | Y |
26.4 | Generalized numeric operations |  |
26.4.1 | `accumulate` | Y |
26.4.2 | `inner_product` | Y |
26.4.3 | `partial_sum` | Y |
26.4.4 | `adjacent_difference` | Y |
26.4.5 | iota | Y |
26.5 | C Library | Y |
27 | Input/output
27.1 | Requirements | Y |
27.2 | Forward declarations | Y |
27.3 | Standard iostream objects | Y |
27.3.1 | Narrow stream objects | Y |
27.3.2 | Wide stream objects | Y |
27.4 | Iostreams base classes | Y |
27.5 | Stream buffers | Y |
27.6 | Formatting and manipulators | Y |
27.7 | String-based streams | Y |
27.8 | File-based streams | Y |
Appendix D | Compatibility features
D.1 | Increment operator with bool operand |  |
D.2 | `static` keyword |  |
D.3 | Access declarations |  |
D.4 | Implicit conversion from const strings |  |
D.5 | C standard library headers |  |
D.6 | Old iostreams members |  |
D.7 | char* streams |  |

## Implementation Specific Behavior

The ISO standard defines the following phrase:

> `[1.3.5] implementation-defined behavior`

>   Behavior, for a well-formed program construct and correct data, that depends on the implementation and that each implementation shall document.

We do so here, for the C++ library only. Behavior of the compiler, linker, runtime loader, and other elements of "the implementation" are documented elsewhere. Everything listed in Annex B, Implementation Qualities, are also part of the compiler, not the library.

For each entry, we give the section number of the standard, when applicable. This list is probably incomplet and inkorrekt.

[1.9]/11 #3 If `isatty(3)` is true, then interactive stream support is implied.

[17.4.4.5] Non-reentrant functions are probably best discussed in the various sections on multithreading (see above).

[18.1]/4 The type of `NULL` is described under Support.

[18.3]/8 Even though it's listed in the library sections, libstdc++ has zero control over what the cleanup code hands back to the runtime loader. Talk to the compiler people. :-)

[18.4.2.1]/5 (bad_alloc), [18.5.2]/5 (bad_cast), [18.5.3]/5 (bad_typeid), [18.6.1]/8 (exception), [18.6.2.1]/5 (bad_exception): The `what()` member function of class `std::exception`, and these other classes publicly derived from it, simply returns the name of the class. But they are the mangled names; you will need to call `c++filt` and pass the names as command-line parameters to demangle them, or call a runtime demangler function. (The classes in `<stdexcept>` have constructors which require an argument to use later for `what()` calls, so the problem of `what()`'s value does not arise in most user-defined exceptions.)

[18.5.1]/7 The return value of `std::type_info::name()` is the mangled type name (see the previous entry for more).

[20.1.5]/5 "Implementors are encouraged to supply libraries that can accept allocators that encapsulate more general memory models and that support non-equal instances. In such implementations, any requirements imposed on allocators by containers beyond those requirements that appear in Table 32, and the semantics of containers and algorithms when allocator instances compare non-equal, are implementation-defined." There is experimental support for non-equal allocators in the standard containers in C++98 mode. There are no additional requirements on allocators. It is undefined behaviour to swap two containers if their allocators are not equal.

[21.1.3.1]/3,4, [21.1.3.2]/2, [23.*]'s foo::iterator, [27.*]'s foo::*_type, others... Nope, these types are called implementation-defined because you shouldn't be taking advantage of their underlying types. Listing them here would defeat the purpose. :-)

[21.1.3.1]/5 I don't really know about the mbstate_t stuff... see the `codecvt` notes for what does exist.

[22.*] Anything and everything we have on locale implementation will be described under Localization.

[26.2.8]/9 I have no idea what `complex<T>`'s `pow(0,0)` returns.

[27.4.2.4]/2 Calling `std::ios_base::sync_with_stdio` after I/O has already been performed on the standard stream objects will flush the buffers, and destroy and recreate the underlying buffer instances. Whether or not the previously-written I/O is destroyed in this process depends mostly on the `--enable-libio` choice: for stdio, if the written data is already in the stdio buffer, the data may be completely safe!

[27.6.1.1.2], [27.6.2.3] The I/O sentry ctor and dtor can perform additional work than the minimum required. We are not currently taking advantage of this yet.

[27.7.1.3]/16, [27.8.1.4]/10 The effects of `pubsetbuf/setbuf` are described in the Input and Output chapter.

[27.8.1.4]/16 Calling `fstream::sync` when a get area exists will... whatever `fflush()` does, I think.