From: Jonathan Wakely
- All of the standard classes and functions from C++98/C++03
+ All of the standard classes and functions from C++98/C++03, C++11 and C++14
(such as string
,
vector<>
, iostreams, algorithms etc.)
- are freely available and atempt to be fully compliant.
+ are freely available and attempt to be fully compliant.
Work is ongoing to complete support for the current revision of the
ISO C++ Standard.
1.3.
@@ -431,7 +432,7 @@ C++ compiler.
4.2.
No 'long long' type on Solaris? -
+
This answer is old and probably no longer be relevant.
By default we try to support the C99 long long type. This requires that certain functions from your C library be present.
@@ -509,7 +510,7 @@ more recent the C library. (This is also documented in the main GCC installation instructions.)
4.8.
- Can't use wchar_t/wstring on FreeBSD
+ Can't use wchar_t/wstring
on FreeBSD
This answer is old and probably no longer be relevant.
Older versions of FreeBSD's C library do not have sufficient support for wide character functions, and as a result the @@ -552,7 +553,8 @@ place), a public list of the library defects is occasionally published on the WG21 website. - Many of these issues have resulted in code changes in libstdc++. + Many of these issues have resulted in + code changes in libstdc++.
If you think you've discovered a new bug that is not listed, please post a message describing your problem to the author of @@ -570,8 +572,8 @@ these lists with terms describing your issue.
Before reporting a bug, please examine the - bugs database with the - category set to âg++â. + bugs database, with the + component set to âc++â.
6.1.
Reopening a stream fails -
- One of the most-reported non-bug reports. Executing a sequence like: +
This answer is old and probably no longer be relevant.
+ Prior to GCC 4.0 this was one of the most-reported non-bug reports. + Executing a sequence like this would fail:
#include <fstream> ... @@ -606,19 +609,20 @@ fs.close(); fs.open("a_new_file");
- All operations on the re-opened fs
will fail, or at
- least act very strangely. Yes, they often will, especially if
- fs
reached the EOF state on the previous file. The
- reason is that the state flags are not cleared
- on a successful call to open(). The standard unfortunately did
- not specify behavior in this case, and to everybody's great sorrow,
- the proposed LWG resolution in
- DR #22 is to leave the flags unchanged. You must insert a call
- to fs.clear()
between the calls to close() and open(),
- and then everything will work like we all expect it to work.
- Update: for GCC 4.0 we implemented the resolution
- of DR #409 and open()
- now calls clear()
on success!
+ All operations on the re-opened fs
would fail, or at
+ least act very strangely, especially if fs
reached the
+ EOF state on the previous file.
+ The original C++98 standard did not specify behavior in this case, and
+ the resolution of DR #22 was to
+ leave the state flags unchanged on a successful call to
+ open()
.
+ You had to insert a call to fs.clear()
between the
+ calls to close()
and open()
,
+ and then everything will work as expected.
+ Update: For GCC 4.0 we implemented the resolution
+ of DR #409 and
+ open()
+ now calls clear()
on success.
6.2.
-Weffc++ complains too much
@@ -626,7 +630,9 @@
libstdc++ -Weffc++
-clean is not a goal of the project,
for a few reasons. Mainly, that option tries to enforce
object-oriented programming, while the Standard Library isn't
- necessarily trying to be OO.
+ necessarily trying to be OO. The option also enforces outdated guidelines
+ from old editions of the books, and the advice isn't all relevant to
+ modern C++ (especially C++11 and later).
We do, however, try to have libstdc++ sources as clean as possible. If
you see some simple changes that pacify -Weffc++
@@ -637,15 +643,16 @@
Another problem is the rel_ops
namespace and the template
comparison operator functions contained therein. If they become
visible in the same namespace as other comparison functions
- (e.g., âusingâ them and the <iterator> header),
+ (e.g., âusingâ them and the
+ <iterator>
header),
then you will suddenly be faced with huge numbers of ambiguity
- errors. This was discussed on the -v3 list; Nathan Myers
+ errors. This was discussed on the mailing list; Nathan Myers
sums
things up here. The collisions with vector/string iterator
types have been fixed for 3.1.
6.4.
The g++-3 headers are not ours -
+
This answer is old and probably no longer be relevant.
If you are using headers in
${prefix}/include/g++-3
, or if
the installed library's name looks like
@@ -698,11 +705,12 @@
    g++ -fPIC -rdynamic -o foo ... -L. -lfoo -ldl
   Â
6.7.
âMemory leaksâ in containers -
+
This answer is old and probably no longer be relevant.
A few people have reported that the standard containers appear to leak memory when tested with memory checkers such as valgrind. - Under some configurations the library's allocators keep free memory in a + Under some (non-default) configurations the library's allocators keep + free memory in a pool for later reuse, rather than returning it to the OS. Although this memory is always reachable by the library and is never lost, memory debugging tools can report it as a leak. If you @@ -710,7 +718,7 @@ Tips for memory leak hunting first.
6.8.
- list::size() is O(n)!
+ list::size()
is O(n)!
See the Containers @@ -734,7 +742,8 @@ creeps back in, it will be caught immediately by the testsuite - but only if such a test exists.
7.1.
- string::iterator is not char*; vector<T>::iterator is not T*
+ string::iterator
is not char*
;
+ vector<T>::iterator
is not T*
If you have code that depends on container<T> iterators being implemented as pointer-to-T, your code is broken. It's @@ -762,38 +772,38 @@ than a typedef for T* outweighs nearly all opposing arguments.
- Code which does assume that a vector iterator i
+ Code which does assume that a vector/string iterator i
is a pointer can often be fixed by changing i
in
- certain expressions to &*i
. Future revisions
- of the Standard are expected to bless this usage for
- vector<> (but not for basic_string<>).
+ certain expressions to &*i
.
7.2.
What's next after libstdc++?
- Hopefully, not much. The goal of libstdc++ is to produce a - fully-compliant, fully-portable Standard Library. After that, - we're mostly done: there won't be any - more compliance work to do. -
- There is an effort underway to add significant extensions to - the standard library specification. The latest version of - this effort is described in - - The C++ Library Technical Report 1. + The goal of libstdc++ is to produce a + fully-compliant, fully-portable Standard Library. + While the C++ Standard continues to evolve the libstdc++ will + continue to track it.
7.3.
What about the STL from SGI?
- The STL from SGI,
- version 3.3, was the final merge of the STL codebase. The
- code in libstdc++ contains many fixes and changes, and
- the SGI code is no longer under active
- development. We expect that no future merges will take place.
+ The STL (Standard Template Library) was the inspiration for large chunks
+ of the C++ Standard Library, but the terms are not interchangeable and
+ they don't mean the same thing. The C++ Standard Library includes lots of
+ things that didn't come from the STL, and some of them aren't even
+ templates, such as std::locale
and
+ std::thread
.
+
+ Libstdc++-v3 incorporates a lot of code from + the SGI STL + (the final merge was from + release 3.3). + The code in libstdc++ contains many fixes and changes compared to the + original SGI code.
In particular, string
is not from SGI and makes no
- use of their "rope" class (which is included as an
- optional extension), nor is valarray
and some others.
- Classes like vector<>
are, but have been
- extensively modified.
+ use of their "rope" class (although that is included as an optional
+ extension), neither is valarray
nor some others.
+ Classes like vector<>
were from SGI, but have
+ been extensively modified.
More information on the evolution of libstdc++ can be found at the API @@ -812,13 +822,17 @@
Yes.
- The C++ Standard Library Technical Report adds many new features to - the library. The latest version of this effort is described in + The C++ Standard Library - Technical Report 1. + Technical Report 1 added many new features to the library.
- The implementation status of TR1 in libstdc++ can be tracked on the TR1 status - page. + The implementation status of TR1 in libstdc++ can be tracked + on the TR1 status page. +
+ New code should probably not use TR1, because almost everything in it has + been added to the main C++ Standard Library (usually with significant + improvements). + The TR1 implementation in libstdc++ is no longer actively maintained.
7.6.
How do I get a copy of the ISO C++ Standard?
Please refer to the Contributing @@ -878,10 +892,14 @@ the decisions, must happen before you can reasonably document a candidate C++ ABI that encompasses the standard library.
7.8.
- How do I make std::vector<T>::capacity() == std::vector<T>::size?
+ How do I make std::vector<T>::capacity() == std::vector<T>::size
?
- The standard idiom for deallocating a vector<T>
's
- unused memory is to create a temporary copy of the vector and swap their
+ Since C++11 just call the shrink_to_fit()
member
+ function.
+
+ Before C++11, the standard idiom for deallocating a
+ vector<T>
's
+ unused memory was to create a temporary copy of the vector and swap their
contents, e.g. for vector<T> v
     std::vector<T>(v).swap(v);
diff --git a/libstdc++-v3/doc/html/manual/bugs.html b/libstdc++-v3/doc/html/manual/bugs.html
index 1cdbf398dce..1ed199e432e 100644
--- a/libstdc++-v3/doc/html/manual/bugs.html
+++ b/libstdc++-v3/doc/html/manual/bugs.html
@@ -1,8 +1,8 @@
Information on known bugs, details on efforts to fix them, and
- fixed bugs are all available as part of the GCC bug tracking system,
- with the category set to libstdc++
.
+ fixed bugs are all available as part of the GCC bug tracking system,
+ under the component âlibstdc++â.
Everybody's got issues. Even the C++ Standard Library.
@@ -12,219 +12,221 @@ a consensus on proposed solutions, we often incorporate the solution.
Here are the issues which have resulted in code changes to the library. - The links are to the specific defect reports from a partial - copy of the Issues List. You can read the full version online + The links are to the full version of the Issues List. + You can read the full version online at the ISO C++ Committee homepage.
If a DR is not listed here, we may simply not have gotten to
- it yet; feel free to submit a patch. Search the include/bits
- and src directories for appearances of
+ it yet; feel free to submit a patch. Search the
+ include
and
+ src
+ directories for appearances of
_GLIBCXX_RESOLVE_LIB_DEFECTS
for examples
of style. Note that we usually do not make changes to the
code until an issue has reached DR status.
-
This should be two overloaded functions rather than a single function. -
Apparently extracting Boolean values was messed up... -
If codecvt::do_in
returns noconv
there are
no changes to the values in [to, to_limit)
.
-
Re-opening a file stream does not clear the state flags. -
Implement the proposed resolution. -
Padding issues. -
An instance of ios_base::failure
is constructed instead.
-
The return type is the previous state of synchronization. -
These members functions are declared private
and are
thus inaccessible. Specifying the correct semantics of
"copying stream state" was deemed too complicated.
-
This DR made many widespread changes to basic_istream
and basic_ostream
all of which have been implemented.
-
Make the policy consistent with that of formatted input, unformatted input, and formatted output. -
And they do now. An editing glitch in the last item in the list of [27.6.1.2.3]/7. -
The text of the standard was gibberish. Typos gone rampant. -
Change the first parameter to stateT&
and implement
the new effects paragraph.
-
Safety checks on the size of the string should test against
max_size()
rather than npos
.
-
The effect contain isspace(c,getloc())
which must be
replaced by isspace(c,is.getloc())
.
-
They behave as a formatted input function and as an unformatted
input function, respectively (except that getline
is
not required to set gcount
).
-
For associative containers where the value type is the same as
the key type, both iterator
and const_iterator
are constant iterators.
-
The binder1st
and binder2nd
didn't have an
operator()
taking a non-const parameter.
-
This was not a const member function. Note that the DR says to replace the function with a const one; we have instead provided an overloaded version with identical contents. -
num_put::put()
was overloaded on the wrong types.
-
Same as 117, but for num_get::get()
.
-
These functions set failbit
on error now.
-
Make member erase
return iterator for set
, multiset
, map
, multimap
.
-
seekp
should only set the output stream, and
seekg
should only set the input stream.
-
op<<
with a const char*
was
calculating an incorrect number of characters to write.
-
Grow efficiently the internal array object. -
Quite complex to summarize... -
This function used to take its arguments as reference-to-const, now it copies them (pass by value). -
Yes, it can, specifically if EOF is reached while skipping whitespace. -
If nothing is extracted into the string, op>>
now
sets failbit
(which can cause an exception, etc., etc.).
-
Both set
and multiset
were missing
overloaded find, lower_bound, upper_bound, and equal_range functions
for const instances.
-
For conversion from a floating-point type, str.precision()
is specified in the conversion specification.
-
Implement N1780, first check before then check after, insert as close to hint as possible. -
The declaration of reverse_iterator
lists a default constructor.
However, no specification is given what this constructor should do.
-
Add a helper for forward_iterator/output_iterator, fix the existing one for input_iterator/output_iterator to not rely on Assignability. -
Store a null character only if the character array has a non-zero size. -
This nested typedef was originally not specified. -
Make the copy constructor and copy-assignment operator declarations public in gslice_array, indirect_array, mask_array, slice_array; provide definitions. -
The default ctor would build its members from copies of temporaries; now it simply uses their respective default ctors. -
The bad_
* classes no longer have destructors (they
are trivial), since no description of them was ever given.
-
The typedefs it inherits from its base classes can't be used, since
(for example) basic_iostream<T>::traits_type
is ambiguous.
-
Similar to 118. -
Add global functions with two template parameters. (NB: not added for now a templated assignment operator) -
If (this == &rhs)
do nothing.
-
If (this == &x)
do nothing.
-
Basically, compare the input character to
is.widen(0)
and is.widen(1)
.
-
Do not specify what codecvt<wchar_t, char,
mbstate_t>::do_length
must return.
-
Change the format string to "%.0Lf". -
Add const overloads of is_open
.
-
Add the real(T)
and imag(T)
members; in C++11 mode, also adjust the existing
real()
and imag()
members and
free functions.
-
Change it to return a const T&
.
-
Implement the proposed resolution. -
Replace "new" with "::new".
Tweak the debug-mode checks in _Safe_iterator. -
Have open
clear the error flags.
Implement Option 3, as per N1599. -
Implement the resolution, beyond DR 169. -
Add three overloads, taking fewer template arguments. -
Implement the resolution, basically cast less. -
Change istreambuf_iterator::reference
in C++11 mode.
-
Don't fail if the next pointer is null and newoff is zero. -
Initialize cerr tied to cout and wcerr tied to wcout. -
Add data()
to std::vector
and
at(const key_type&)
to std::map
.
-
Change lt
.
-
Fix the parameters.
Use &value. -
In case of input_iterator/output_iterator rely on Assignability of input_iterator' value_type. -
We were almost doing the right thing, just use std::move in adjacent_difference. -
Add an auto_ptr<void> specialization. -
Follow the straightforward proposed resolution. -
In C++11 mode, remove the pow(float,int), etc., signatures. -
Change it to be a formatted output function (i.e. catch exceptions). -
Add the missing modes to fopen_mode. -
Implement the simple resolution. -
Add the missing operations. -
In C++11 mode add cbegin(size_type) and cend(size_type) to the unordered containers. -
Add it, consistently with the discussion. -
Make the member functions table and classic_table public. -
Implement the straightforward resolution. -
In C++11 mode, add at() and at() const. -
Implement the int -> size_t replacements. -
In C++11 mode, remove assign, add fill. -
In C++11 mode, add std::proj. -
Add the overload. -
Update / add the signatures. -
The traditional HP / SGI return type and value is blessed by the resolution of the DR. -
Return the end of the filled range. -
result_of
Correctly decay types in signature of std::async
.
-
is_destructible
underspecified
Handle non-object types. -
Reorder enumerators. -
Add additional overloads. -
std::function
swaps
Add noexcept
to swap functions.
-
Respect propagation trait for move assignment. -
Add noexcept to the comparison operators. -
Fix signatures. -
Use the referenceable type concept. -
Change the reference
type.
-
Define and use is_always_equal
even for C++11.
-
unique_ptr
for array does not support cv qualification conversion of actual argument
Adjust constraints to allow safe conversions. -
raw_storage_iterator
Add assignment operator taking an rvalue. -
std::function
ambiguity
Constrain the constructor to only accept callable types. -
common_type
trait produces reference types
Use decay
for the result type.
-
noexcept
specification in type_index
Add noexcept
-
error_category
default constructor
Declare a public constexpr constructor. -
allocator_traits::max_size
missing noexcept
Add noexcept
.
-
vector<bool>
is missing emplace
and emplace_back
member functions
Add emplace
and emplace_back
member functions.
-
std::abs(0u)
is unclear
Move all declarations to a common header and remove the
generic abs
which accepted unsigned arguments.
-
is_*[copy/move]_[constructible/assignable]
unclear for non-referencable types
Use the referenceable type concept. -
tuple_size
for const pair
request <tuple>
header
The tuple_size
and tuple_element
partial specializations are defined in <utility>
which
is included by <array>
.
-
std::addressof
should be constexpr
Use __builtin_addressof
and add
constexpr
to addressof
for C++17 and later.
-
tuple_size
should always derive from integral_constant<size_t, N>
Update definitions of the partial specializations for const and volatile types. -
Use perfect forwarding for right operand. -
regex_match()/regex_search()
with match_results
should forbid temporary strings
Add deleted overloads for rvalue strings. -
regex_iterator/regex_token_iterator
should forbid temporary regexes
Add deleted constructors. -
shared_ptr
's constructor from unique_ptr
should be constrained
Constrain the constructor to require convertibility. -
shared_ptr
's get_deleter()
should use addressof()
Use addressof
.
-
std::function
needs more noexcept
Add noexcept
to the assignment and comparisons.
-
packaged_task(allocator_arg_t, const Allocator&, F&&)
should neither be constrained nor explicit
Remove explicit
from the constructor.
-
unique_ptr
and shared_ptr
Create empty an shared_ptr
from an empty
unique_ptr
.
-
apply
does not work with member pointers
Use mem_fn
for member pointers.
-
seed_seq::size()
should be noexcept
Add noexcept
.
-
Define the typedefs. -
call_once()
shouldn't DECAY_COPY()
Remove indirection through call wrapper that made copies
of arguments and forward arguments straight to std::invoke
.
-