<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE html
          PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
   <meta name="KEYWORDS" content="libstdc++, libstdc++-v3, GCC, g++, libg++, STL" />
   <meta name="DESCRIPTION" content="FAQ for the GNU libstdc++ effort." />
   <title>libstdc++-v3 FAQ</title>
<link rel="StyleSheet" href="../lib3styles.css" />
<link rel="Start" rev="Help" href="../documentation.html" type="text/html"
 title="GNU C++ Standard Library" />
<link rel="Copyright" href="../17_intro/license.html" type="text/html" />
</head>
<body>

<h1 class="centered">libstdc++ Frequently Asked Questions</h1>

<p class="fineprint"><em>
   The latest version of this document is always available at
   <a href="http://gcc.gnu.org/onlinedocs/libstdc++/faq/">
   http://gcc.gnu.org/onlinedocs/libstdc++/faq/</a>.  The main documentation
   page is at
   <a href="http://gcc.gnu.org/onlinedocs/libstdc++/documentation.html">
   http://gcc.gnu.org/onlinedocs/libstdc++/documentation.html</a>.
</em></p>

<p><em>
   To the <a href="http://gcc.gnu.org/libstdc++/">libstdc++-v3 homepage</a>.
</em></p>

<!-- ####################################################### -->
<hr />
<h1>Questions</h1>
<ol>
   <li><a href="#1_0">General Information</a>
   <!-- I suspect these will mostly be links to/into existing documents. -->
   <ol>
      <li><a href="#1_1">What is libstdc++-v3?</a> </li>
      <li><a href="#1_2">Why should I use libstdc++?</a> </li>
      <li><a href="#1_3">Who's in charge of it?</a> </li>
      <li><a href="#1_4">How do I get libstdc++?</a> </li>
      <li><a href="#1_5">When is libstdc++ going to be finished?</a> </li>
      <li><a href="#1_6">How do I contribute to the effort?</a> </li>
      <li><a href="#1_7">What happened to libg++?  I need that!</a> </li>
      <li><a href="#1_8">What if I have more questions?</a> </li>
      <li><a href="#1_9">What are the license terms for libstdc++-v3?</a> </li>
   </ol>
   </li>

   <li><a href="#2_0">Installation</a>
      <ol>
         <li><a href="#2_1">How do I install libstdc++-v3?</a> </li>
         <li><a href="#2_2">[removed]</a> </li>
         <li><a href="#2_3">What is this CVS thing that you keep
                            mentioning?</a> </li>
         <li><a href="#2_4">How do I know if it works?</a> </li>
         <li><a href="#2_5">This library is HUGE!  And what's libsupc++?</a> </li>
         <li><a href="#2_6">Why do I get an error saying
                            <code>libstdc++.so.X</code> is missing when I
                            run my program?</a> </li>
      </ol>
   </li>

   <li><a href="#3_0">Platform-Specific Issues</a>
      <ol>
         <li><a href="#3_1">Can libstdc++-v3 be used with &lt;my
                            favorite compiler&gt;?</a> </li>
         <li><a href="#3_2">[removed]</a> </li>
         <li><a href="#3_3">[removed]</a> </li>
         <li><a href="#3_4">I can't use 'long long' on Solaris</a> </li>
         <li><a href="#3_5"><code>_XOPEN_SOURCE</code> /
                            <code>_GNU_SOURCE</code> / etc is always defined</a>
         </li>
         <li><a href="#3_6">OS X ctype.h is broken!  How can I hack it?</a></li>
         <li><a href="#3_7">Threading is broken on i386</a></li>
         <li><a href="#3_8">Recent GNU/Linux glibc required?</a></li>
         <li><a href="#3_9">Can't use wchar_t/wstring on FreeBSD</a></li>
         <li><a href="#3_10">MIPS atomic operations</a></li>
      </ol>
   </li>

   <li><a href="#4_0">Known Bugs and Non-Bugs</a>
      <ol>
         <li><a href="#4_1">What works already?</a> </li>
         <li><a href="#4_2">Bugs in gcc/g++ (not libstdc++-v3)</a> </li>
         <li><a href="#4_3">Bugs in the C++ language/lib specification</a> </li>
         <li><a href="#4_4">Things in libstdc++ that only look like bugs</a><ul>
           <li><a href="#4_4_iostreamclear">reopening a stream fails</a> </li>
           <li><a href="#4_4_Weff">-Weffc++ complains too much</a> </li>
           <li><a href="#4_4_rel_ops">&quot;ambiguous overloads&quot;
                               after including an old-style header</a> </li>
           <li><a href="#4_4_interface">The g++-3 headers are
                               <strong>not ours</strong></a> </li>
           <li><a href="#4_4_glibc">compilation errors from streambuf.h</a> </li>
           <li><a href="#4_4_checks">errors about <em>*Concept</em> and
                               <em>constraints</em> in the STL...</a> </li>
           <li><a href="#4_4_dlsym">program crashes when using library code
                               in a dynamically-loaded library</a> </li>
           <li><a href="#4_4_leak">"memory leaks" in containers</a> </li>
         </ul>
         </li>
         <li><a href="#4_5">Aw, that's easy to fix!</a> </li>
      </ol>
   </li>

   <li><a href="#5_0">Miscellaneous</a>
      <ol>
         <li><a href="#5_1">string::iterator is not char*;
                            vector&lt;T&gt;::iterator is not T*</a> </li>
         <li><a href="#5_2">What's next after libstdc++-v3?</a> </li>
         <li><a href="#5_3">What about the STL from SGI?</a> </li>
         <li><a href="#5_4">Extensions and Backward Compatibility</a> </li>
         <li><a href="#5_5">[removed]</a> </li>
         <li><a href="#5_6">Is libstdc++-v3 thread-safe?</a> </li>
         <li><a href="#5_7">How do I get a copy of the ISO C++ Standard?</a> </li>
         <li><a href="#5_8">What's an ABI and why is it so messy?</a> </li>
         <li><a href="#5_9">How do I make std::vector&lt;T&gt;::capacity() 
                            == std::vector&lt;T&gt;::size?</a> </li>
      </ol>
   </li>

</ol>

<hr />

<!-- ####################################################### -->

<h1><a name="1_0">1.0 General Information</a></h1>
<!-- I suspect these will mostly be links to/into existing documents. -->
   <h2><a name="1_1">1.1 What is libstdc++-v3?</a></h2>
      <p>The GNU Standard C++ Library v3 is an
         ongoing project to implement the ISO 14882 Standard C++ library
         as described in chapters 17 through 27 and annex D.
         For those who want to see exactly how
         far the project has come, or just want the latest
         bleeding-edge code, the up-to-date source is available over
         anonymous CVS, and can even be browsed over the Web (see
         <a href="#1_4">1.4</a> below).
      </p>
      <p>The older libstdc++-v2 project is no longer maintained; the code
         has been completely replaced and rewritten.
         <a href="#4_4_interface">If you are using V2</a>, then you need to
         report bugs to your system vendor, not to the V3 list.
      </p>
      <p>A more formal description of the V3 goals can be found in the
         official <a href="../17_intro/DESIGN">design document</a>.
      </p>

<hr />
   <h2><a name="1_2">1.2 Why should I use libstdc++?</a></h2>
      <p>The completion of the ISO C++ standardization gave the
         C++ community a powerful set of reuseable tools in the form
         of the C++ Standard Library.  However, all existing C++
         implementations are (as the Draft Standard used to say)
         &quot;incomplet and incorrekt,&quot; and many suffer from
         limitations of the compilers that use them.
      </p>
      <p>The GNU C/C++/FORTRAN/&lt;pick-a-language&gt; compiler
         (<code>gcc</code>, <code>g++</code>, etc) is widely considered to be
         one of the leading compilers in the world.  Its development
         is overseen by the
         <a href="http://gcc.gnu.org/">GCC team</a>.  All of
         the rapid development and near-legendary
         <a href="http://gcc.gnu.org/gcc-3.3/buildstat.html">portability</a>
         that are the hallmarks of an open-source project are being
         applied to libstdc++.
      </p>
      <p>That means that all of the Standard classes and functions
         (such as <code>string</code>, <code>vector&lt;&gt;</code>, iostreams,
         and algorithms) will be freely available and fully compliant.
         Programmers will no longer need to &quot;roll their own&quot;
         nor be worried about platform-specific incompatibilities.
      </p>

<hr />
   <h2><a name="1_3">1.3 Who's in charge of it?</a></h2>
      <p>The libstdc++ project is contributed to by several developers
         all over the world, in the same way as GCC or Linux.
         Benjamin Kosnik, Gabriel Dos Reis, Phil Edwards, Ulrich Drepper,
         Loren James Rittle, and Paolo Carlini are the lead maintainers of
         the CVS archive.
      </p>
      <p>Development and discussion is held on the libstdc++ mailing
         list.  Subscribing to the list, or searching the list
         archives, is open to everyone.  You can read instructions for
         doing so on the <a href="http://gcc.gnu.org/libstdc++/">homepage</a>.
         If you have questions, ideas, code, or are just curious, sign up!
      </p>

<hr />
   <h2><a name="1_4">1.4 How do I get libstdc++?</a></h2>
      <p>The <a href="http://gcc.gnu.org/libstdc++/">homepage</a>
         has instructions for retrieving the latest CVS sources, and for
         browsing the CVS sources over the web.
      </p>
      <p>Stable versions of libstdc++-v3 are included with releases of
         <a href="http://gcc.gnu.org/releases.html">the GCC compilers</a>.
      </p>
      <p>The subset commonly known as the Standard Template Library
         (chapters 23 through 25, mostly) is adapted from the final release
         of the SGI STL, with extensive changes.
      </p>

<hr />
   <h2><a name="1_5">1.5 When is libstdc++ going to be finished?</a></h2>
<!--      <p>Nathan Myers gave the best of all possible answers in <a
         href="http://www.deja.com/getdoc.xp?AN=469581698&fmt=text">a
         Usenet article</a>.</p>
which is no longer available, thanks deja...-->
      <p>Nathan Myers gave the best of all possible answers, responding to a
         Usenet article asking this question:  <em>Sooner, if you help.</em>
      </p>

<hr />
   <h2><a name="1_6">1.6 How do I contribute to the effort?</a></h2>
      <p>Here is <a href="../17_intro/contribute.html">a
         page devoted to this topic</a>.  Subscribing to the mailing
         list (see above, or the homepage) is a very good idea if you
         have something to contribute, or if you have spare time and
         want to help.  Contributions don't have to be in the form of
         source code; anybody who is willing to help write
         documentation, for example, or has found a bug in code that
         we all thought was working, is more than welcome!
      </p>

<hr />
   <h2><a name="1_7">1.7 What happened to libg++?  I need that!</a></h2>
      <p>The most recent libg++ README states that libg++ is no longer
         being actively maintained.  It should not be used for new
         projects, and is only being kicked along to support older code.
      </p>
      <p>The libg++ was designed and created when there was no Standard
         to provide guidance.  Classes like linked lists are now provided
         for by <code>list&lt;T&gt;</code> and do not need to be created by
         <code>genclass</code>.  (For that matter, templates exist now and
         are well-supported, whereas genclass (mostly) predates them.)
      </p>
      <p>There are other classes in libg++ that are not specified in the
         ISO Standard (e.g., statistical analysis).  While there are a
         lot of really useful things that are used by a lot of people
         (e.g., statistics :-), the Standards Committee couldn't include
         everything, and so a lot of those &quot;obvious&quot; classes
         didn't get included.
      </p>
      <p>Since libstdc++ is an implementation of the Standard Library, we
         have no plans at this time to include non-Standard utilities
         in the implementation, however handy they are.  (The extensions
         provided in the SGI STL aren't maintained by us and don't get
         a lot of our attention, because they don't require a lot of our
         time.)  It is entirely plausable that the &quot;useful stuff&quot;
         from libg++ might be extracted into an updated utilities library,
         but nobody has started such a project yet.
      </p>
      <p>(The <a href="http://www.boost.org/">Boost</a> site houses free
         C++ libraries that do varying things, and happened to be started
         by members of the Standards Committee.  Certain &quot;useful
         stuff&quot; classes will probably migrate there.)
      </p>
      <p>For the bold and/or desperate, the
         <a href="http://gcc.gnu.org/extensions.html">GCC extensions page</a>
         describes where to find the last libg++ source.
      </p>

<hr />
   <h2><a name="1_8">1.8 What if I have more questions?</a></h2>
      <p>If you have read the README and RELEASE-NOTES files, and your
         question remains unanswered, then just ask the mailing list.
         At present, you do not need to be subscribed to the list to
         send a message to it.  More information is available on the
         homepage (including how to browse the list archives); to send
         to the list, use <a href="mailto:libstdc++@gcc.gnu.org">
         <code>libstdc++@gcc.gnu.org</code></a>.
      </p>
      <p>If you have a question that you think should be included here,
         or if you have a question <em>about</em> a question/answer here,
         contact <a href="mailto:pme@gcc.gnu.org">Phil Edwards</a>
         or <a href="mailto:gdr@gcc.gnu.org">Gabriel Dos Reis</a>.
      </p>

<hr />
   <h2><a name="1_9">1.9 What are the license terms for libstdc++-v3?</a></h2>
      <p>See <a href="../17_intro/license.html">our license description</a>
         for these and related questions.
      </p>

<hr />
<h1><a name="2_0">2.0 Installation</a></h1>
   <h2><a name="2_1">2.1 How do I install libstdc++-v3?</a></h2>
      <p>Complete instructions are not given here (this is a FAQ, not
         an installation document), but the tools required are few:
      </p>
         <ul>
            <li> A 3.x release of GCC.  Note that building GCC is much
                 easier and more automated than building the GCC 2.[78]
                 series was.  If you are using GCC 2.95, you can still
                 build earlier snapshots of libstdc++.
            </li>
            <li> GNU Make is required for GCC 3.4 and later.
            </li>
            <li> The GNU Autotools are needed if you are messing with
                 the configury or makefiles.
            </li>
         </ul>
      <p>The file <a href="../documentation.html">documentation.html</a>
         provides a good overview of the steps necessary to build, install,
         and use the library.  Instructions for configuring the library
         with new flags such as --enable-threads are there also, as well as
         patches and instructions for working with GCC 2.95.
      </p>
      <p>The top-level install.html and
         <a href="../17_intro/RELEASE-NOTES">RELEASE-NOTES</a> files contain
         the exact build and installation instructions.  You may wish to
         browse those files over CVSweb ahead of time to get a feel for
         what's required.  RELEASE-NOTES is located in the
         &quot;.../docs/17_intro/&quot; directory of the distribution.
      </p>

<hr />
   <h2><a name="2_2">2.2 [removed]</a></h2>
      <p>This question has become moot and has been removed.  The stub
         is here to preserve numbering (and hence links/bookmarks).
      </p>

<hr />
   <h2><a name="2_3">2.3 What is this CVS thing that you
                         keep mentioning?</a></h2>
      <p>The <em>Concurrent Versions System</em> is one of several revision
         control packages.  It was selected for GNU projects because it's
         free (speech), free (beer), and very high quality.  The <a
         href="http://www.gnu.org/software/cvs/cvs.html">CVS entry in
         the GNU software catalogue</a> has a better description as
         well as a
         <a href="http://www.cvshome.org/">link to the makers of CVS</a>.
      </p>
      <p>The &quot;anonymous client checkout&quot; feature of CVS is
         similar to anonymous FTP in that it allows anyone to retrieve
         the latest libstdc++ sources.
      </p>
      <p>After the first of April, American users will have a
         &quot;/pharmacy&quot; command-line option...
         <!-- wonder how long that'll live -->
      </p>

<hr />
   <h2><a name="2_4">2.4 How do I know if it works?</a></h2>
      <p>libstdc++-v3 comes with its own testsuite.  You do not need
         to actually install the library (&quot;<code>make
         install</code>&quot;) to run the testsuite, but you do need
         DejaGNU, as described
         <a href="http://gcc.gnu.org/install/test.html">here</a>.
      </p>
      <p>To run the testsuite on the library after building it, use
         &quot;make check&quot; while in your build directory.  To run
         the testsuite on the library after building and installing it,
         use &quot;make check-install&quot; instead.
      </p>
      <p>If you find bugs in the testsuite programs themselves, or if you
         think of a new test program that should be added to the suite,
         <strong>please</strong> write up your idea and send it to the list!
      </p>

<hr />
   <h2><a name="2_5">2.5 This library is HUGE!  And what's libsupc++?</a></h2>
      <p>Usually the size of libraries on disk isn't noticeable.  When a
         link editor (or simply &quot;linker&quot;) pulls things from a
         static archive library, only the necessary object files are copied
         into your executable, not the entire library.  Unfortunately, even
         if you only need a single function or variable from an object file,
         the entire object file is extracted.  (There's nothing unique to C++
         or libstdc++-v3 about this; it's just common behavior, given here
         for background reasons.)
      </p>
      <p>Some of the object files which make up libstdc++.a are rather large.
         If you create a statically-linked executable with
         <code> -static</code>, those large object files are suddenly part
         of your executable.  Historically the best way around this was to
         only place a very few functions (often only a single one) in each
         source/object file; then extracting a single function is the same
         as extracting a single .o file.  For libstdc++-v3 this is only
         possible to a certain extent; the object files in question contain
         template classes and template functions, pre-instantiated, and
         splitting those up causes severe maintenance headaches.
      </p>
      <p>It's not a bug, and it's not really a problem.  Nevertheless, some
         people don't like it, so here are two pseudo-solutions:
      </p>
      <p>If the only functions from libstdc++.a which you need are
         language support functions (those listed in <a
         href="../18_support/howto.html">clause 18</a> of the
         standard, e.g., <code>new</code> and <code>delete</code>),
         then try linking against <code>libsupc++.a</code> (Using
         <code>gcc</code> instead of <code>g++</code> and explicitly
         linking in <code>-lsupc++</code> for the final link step will
         do it).  This library contains only those support routines,
         one per object file.  But if you are using anything from the
         rest of the library, such as IOStreams or vectors, then
         you'll still need pieces from <code>libstdc++.a</code>.
      </p>
      <p>The second method is one we hope to incorporate into the library
         build process.  Some platforms can place each function and variable
         into its own section in a .o file.  The GNU linker can then perform
         garbage collection on unused sections; this reduces the situation
         to only copying needed functions into the executable, as before,
         but all happens automatically.
      </p>
      <p>Unfortunately the garbage collection in GNU ld is buggy; sections
         (corresponding to functions and variables) which <em>are</em> used
         are mistakenly removed, leading to horrible crashes when your
         executable starts up.  For the time being, this feature is not used
         when building the library.
      </p>

<hr />
   <h2><a name="2_6">2.6 Why do I get an error saying
                         <code>libstdc++.so.X</code> is missing when I run
                         my program?</a></h2>
      <p>Depending on your platform and library version, the message might
         be similar to one of the following:
      </p>
      <pre>
    ./a.out: error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory

    /usr/libexec/ld-elf.so.1: Shared object "libstdc++.so.6" not found </pre>

      <p>This doesn't mean that the shared library isn't installed, only
         that the dynamic linker can't find it. When a dynamically-linked
         executable is run the linker finds and loads the required shared
         libraries by searching a pre-configured list of directories. If
         the directory where you've installed libstdc++ is not in this
         list then the libraries won't be found. The simplest way to fix
         this is to use the <code>LD_LIBRARY_PATH</code> environment
         variable, which is a colon-separated list of directories in which
         the linker will search for shared libraries:
      </p>
      <pre>
    LD_LIBRARY_PATH=${prefix}/lib:$LD_LIBRARY_PATH
    export LD_LIBRARY_PATH </pre>
      <p>The exact environment variable to use will depend on your platform,
         e.g. DYLD_LIBRARY_PATH for Darwin,
         LD_LIBRARY_PATH_32/LD_LIBRARY_PATH_64 for Solaris 32-/64-bit,
         LD_LIBRARYN32_PATH/LD_LIBRARY64_PATH for Irix N32/64-bit ABIs
         and SHLIB_PATH for HP-UX.
      </p>
      <p>See the man pages for <code>ld(1)</code>, <code>ldd(1)</code> and
         <code>ldconfig(8)</code> for more information. The dynamic linker
         has different names on different platforms but the man page is
         usually called something such as <code>ld.so / rtld / dld.so</code>.
      </p>

<hr />
<h1><a name="3_0">3.0 Platform-Specific Issues</a></h1>
   <h2><a name="3_1">3.1 Can libstdc++-v3 be used with &lt;my
                         favorite compiler&gt;?</a></h2>
      <p>Probably not.  Yet.</p>
      <p>Because GCC advances so rapidly, development and testing of
         libstdc++ is being done almost entirely under that compiler.
         If you are curious about whether other, lesser compilers
         (*grin*) support libstdc++, you are more than welcome to try.
         Configuring and building the library (see above) will still
         require certain tools, however.  Also keep in mind that
         <em>building</em> libstdc++ does not imply that your compiler
         will be able to <em>use</em> all of the features found in the
         C++ Standard Library.
      </p>
      <p>Since the goal of ISO Standardization is for all C++
         implementations to be able to share code, the final libstdc++
         should, in theory, be usable under any ISO-compliant
         compiler.  It will still be targeted and optimized for
         GCC/g++, however.
      </p>

<hr />
   <h2><a name="3_2">3.2 [removed]</a></h2>
      <p>This question has become moot and has been removed.  The stub
         is here to preserve numbering (and hence links/bookmarks).
      </p>

<hr />
   <h2><a name="3_3">3.3 [removed]</a></h2>
      <p>This question has become moot and has been removed.  The stub
         is here to preserve numbering (and hence links/bookmarks).
      </p>

<hr />
   <h2><a name="3_4">3.4 I can't use 'long long' on Solaris</a></h2>
      <p>By default we try to support the C99 <code>long long</code> type.
         This requires that certain functions from your C library be present.
      </p>
      <p>Up through release 3.0.2 the tests performed were too general, and
         this feature was disabled when it did not need to be.  The most
         commonly reported platform affected was Solaris.
      </p>
      <p>This has been fixed for 3.0.3 and onwards.
      </p>

<hr />
   <h2><a name="3_5">3.5 <code>_XOPEN_SOURCE</code> / <code>_GNU_SOURCE</code>
                         / etc is always defined</a></h2>
      <p>On Solaris, g++ (but not gcc) always defines the preprocessor
         macro <code>_XOPEN_SOURCE</code>.  On GNU/Linux, the same happens
         with <code>_GNU_SOURCE</code>.  (This is not an exhaustive list;
         other macros and other platforms are also affected.)
      </p>
      <p>These macros are typically used in C library headers, guarding new
         versions of functions from their older versions.  The C++ standard
         library includes the C standard library, but it requires the C90
         version, which for backwards-compatability reasons is often not the
         default for many vendors.
      </p>
      <p>More to the point, the C++ standard requires behavior which is only
         available on certain platforms after certain symbols are defined.
         Usually the issue involves I/O-related typedefs.  In order to
         ensure correctness, the compiler simply predefines those symbols.
      </p>
      <p>Note that it's not enough to #define them only when the library is
         being built (during installation).  Since we don't have an 'export'
         keyword, much of the library exists as headers, which means that
         the symbols must also be defined as your programs are parsed and
         compiled.
      </p>
      <p>To see which symbols are defined, look for CPLUSPLUS_CPP_SPEC in
         the gcc config headers for your target (and try changing them to
         see what happens when building complicated code).  You can also run
         <code>&quot;g++ -E -dM - &lt; /dev/null&quot;</code> to display
         a list of predefined macros for any particular installation.
      </p>
      <p>This has been discussed on the mailing lists
         <a href="http://gcc.gnu.org/cgi-bin/htsearch?method=and&amp;format=builtin-long&amp;sort=score&amp;words=_XOPEN_SOURCE+Solaris">quite a bit</a>.
      </p>
      <p>This method is something of a wart.  We'd like to find a cleaner
         solution, but nobody yet has contributed the time.
      </p>

<hr />
   <h2><a name="3_6">3.6 OS X ctype.h is broken!  How can I hack it?</a></h2>
      <p>This is a long-standing bug in the OS X support.  Fortunately,
         the patch is quite simple, and well-known.
         <a href="http://gcc.gnu.org/ml/gcc/2002-03/msg00817.html"> Here's a
         link to the solution.</a>
      </p>

<hr />
   <h2><a name="3_7">3.7 Threading is broken on i386</a></h2>
      <p>Support for atomic integer operations is/was broken on i386
         platforms.  The assembly code accidentally used opcodes that are
         only available on the i486 and later.  So if you configured GCC
         to target, for example, i386-linux, but actually used the programs
         on an i686, then you would encounter no problems.  Only when
         actually running the code on a i386 will the problem appear.
      </p>
      <p>This is fixed in 3.2.2.
      </p>

<hr />
   <h2><a name="3_8">3.8 Recent GNU/Linux glibc required?</a></h2>
      <p>When running on GNU/Linux, libstdc++ 3.2.1 (shared library version
         5.0.1) and later uses localization and formatting code from the system
         C library (glibc) version 2.2.5.  That version of glibc is over a
         year old and contains necessary bugfixes.  Many GNU/Linux distros make
         glibc version 2.3.x available now.
      </p>
      <p>The guideline is simple:  the more recent the C++ library, the
         more recent the C library.  (This is also documented in the main
         GCC installation instructions.)
      </p>

<hr />
   <h2><a name="3_9">3.9 Can't use wchar_t/wstring on FreeBSD</a></h2>
      <p>At the moment there are a few problems in FreeBSD's support for
         wide character functions, and as a result the libstdc++ configury
         decides that wchar_t support should be disabled.  Once the underlying
         problems are fixed in FreeBSD (soon), the library support will
         automatically enable itself.
      </p>
      <p>You can fix the problems yourself, and learn more about the situation,
         by reading
         <a href="http://gcc.gnu.org/ml/libstdc++/2003-02/subjects.html#00286">
         this short thread</a> (&quot;_GLIBCPP_USE_WCHAR_T undefined in
         FreeBSD's c++config.h?&quot;).
      </p>

<hr />
   <h2><a name="3_10">3.10 MIPS atomic operations</a></h2>
      <p>The atomic locking routines for MIPS targets requires MIPS II
         and later.  A patch went in just after the 3.3 release to
         make mips* use the generic implementation instead.  You can also
         configure for mipsel-elf as a workaround.
      </p>
      <p>mips*-*-linux* continues to use the MIPS II routines, and more
         work in this area is expected.
      </p>

<hr />
<h1><a name="4_0">4.0 Known Bugs and Non-Bugs</a></h1>
   <em>Note that this section can get rapdily outdated -- such is the
       nature of an open-source project.  For the latest information, join
       the mailing list or look through recent archives.   The RELEASE-
       NOTES and BUGS files are generally kept up-to-date.</em>

   <p>For 3.0.1, the most common &quot;bug&quot; is an apparently missing
      &quot;<code>../</code>&quot; in include/Makefile, resulting in files
      like gthr.h and gthr-single.h not being found.  Please read
      <a href="http://gcc.gnu.org/install/configure.html">the configuration
      instructions for GCC</a>,
      specifically the part about configuring in a separate build directory,
      and how strongly recommended it is.  Building in the source directory
      is fragile, is rarely tested, and tends to break, as in this case.
      This was fixed for 3.0.2.
   </p>

   <p>For 3.1, the most common &quot;bug&quot; is a parse error when using
      <code>&lt;fstream&gt;</code>, ending with a message,
      &quot;<code>bits/basic_file.h:52: parse error before `{'
      token</code>.&quot;  Please read
      <a href="http://gcc.gnu.org/install/">the installation instructions for
      GCC</a>, specifically the part about not installing newer versions on
      top of older versions.  If you install 3.1 over a 3.0.x release, then
      the wrong basic_file.h header will be found (its location changed
      between releases).
   </p>

   <p><strong>Please do not report these as bugs.  We know about them.</strong>
      Reporting this -- or any other problem that's already been fixed --
      hinders the development of GCC, because we have to take time to
      respond to your report.  Thank you.
   </p>

<hr />
   <h2><a name="4_1">4.1 What works already?</a></h2>
      <p>Short answer:  Pretty much everything <em>works</em> except for some
         corner cases.  Also, localization is incomplete.  For whether it works
         well, or as you expect it to work, see 5.2.
      </p>
      <p>Long answer:  See the docs/html/17_intro/CHECKLIST file, which is
         badly outdated...  Also see the RELEASE-NOTES file, which is kept
         more up to date.
      </p>

<hr />
   <h2><a name="4_2">4.2 Bugs in gcc/g++ (not libstdc++-v3)</a></h2>
      <p>This is by no means meant to be complete nor exhaustive, but
         mentions some problems that users may encounter when building
         or using libstdc++.  If you are experiencing one of these
         problems, you can find more information on the libstdc++ and
         the GCC mailing lists.
      </p>
      <p>Before reporting a bug, examine the
         <a href="http://gcc.gnu.org/bugs.html">bugs database</a> with the
         category set to &quot;libstdc++&quot;.  The BUGS file in the source
         tree also tracks known serious problems.
      </p>
      <ul>
         <li>Debugging is problematic, due to bugs in line-number generation
             (mostly fixed in the compiler) and gdb lagging behind the
             compiler (lack of personnel).  We recommend configuring the
             compiler using <code>--with-dwarf2</code> if the DWARF2
             debugging format is not already the default on your platform.
             Also,
<a href="http://gcc.gnu.org/ml/libstdc++/2002-02/msg00034.html">changing your
             GDB settings</a> can have a profound effect on your C++ debugging
             experiences.  :-)</li>
      </ul>

<hr />
   <h2><a name="4_3">4.3 Bugs in the C++ language/lib specification</a></h2>
      <p>Yes, unfortunately, there are some.  In a
         <a href="http://gcc.gnu.org/ml/libstdc++/1998/msg00006.html">message
         to the list</a>, Nathan Myers announced that he has started a list of
         problems in the ISO C++ Standard itself, especially with
         regard to the chapters that concern the library.  The list
         itself is
         <a href="http://www.cantrip.org/draft-bugs.txt">posted on his
         website</a>.  Developers who are having problems interpreting
         the Standard may wish to consult his notes.
      </p>
      <p>For those people who are not part of the ISO Library Group
         (i.e., nearly all of us needing to read this page in the first
         place :-), a public list of the library defects is occasionally
         published <a href="http://anubis.dkuug.dk/jtc1/sc22/wg21/">here</a>.
         Some of these have resulted in <a href="#5_2">code changes</a>.
      </p>

<hr />
   <h2><a name="4_4">4.4 Things in libstdc++ that only look like bugs</a></h2>
      <p>There are things which are not bugs in the compiler (4.2) nor
         the language specification (4.3), but aren't really bugs in
         libstdc++, either.  Really!  Please do not report these as bugs.
      </p>
      <p><a name="4_4_Weff"><strong>-Weffc++</strong></a>
         The biggest of these is the quadzillions of warnings about the
         library headers emitted when <code>-Weffc++</code> is used.  Making
         libstdc++ &quot;-Weffc++-clean&quot; 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.
      </p>
      <p><a name="4_4_iostreamclear"><strong>reopening a stream fails</strong>
         </a> Did I just say that -Weffc++ was our biggest false-bug report?
         I lied.  (It used to be.)  Today it seems to be reports that after
         executing a sequence like
      </p>
      <pre>
    #include &lt;fstream&gt;
    ...
    std::fstream  fs(&quot;a_file&quot;);
    // .
    // . do things with fs...
    // .
    fs.close();
    fs.open(&quot;a_new_file&quot;);</pre>
      <p>all operations on the re-opened <code>fs</code> will fail, or at
         least act very strangely.  Yes, they often will, especially if
         <code>fs</code> reached the EOF state on the previous file.  The
         reason is that the state flags are <strong>not</strong> cleared
         on a successful call to open().  The standard unfortunately did
         not specify behavior in this case, and to everybody's great sorrow,
         the <a href="../ext/howto.html#5">proposed LWG resolution in
         DR #22</a> is to leave the flags unchanged.  You must insert a call
         to <code>fs.clear()</code> between the calls to close() and open(),
         and then everything will work like we all expect it to work.
	 <strong>Update:</strong> for GCC 4.0 we implemented the resolution
	 of <a href="../ext/howto.html#5">DR #409</a> and open() now calls
	 <code>clear()</code> on success!
      </p>
      <p><a name="4_4_rel_ops"><strong>rel_ops</strong></a>
         Another is the <code>rel_ops</code> namespace and the template
         comparison operator functions contained therein.  If they become
         visible in the same namespace as other comparison functions
         (e.g., '<code>using</code>' them and the &lt;iterator&gt; header),
         then you will suddenly be faced with huge numbers of ambiguity
         errors.  This was discussed on the -v3 list; Nathan Myers
         <a href="http://gcc.gnu.org/ml/libstdc++/2001-01/msg00247.html">sums
         things up here</a>.  The collisions with vector/string iterator
         types have been fixed for 3.1.  <!-- more links to email here -->
      </p>
      <h3><a name="4_4_interface">The g++-3 headers are <em>not ours</em></a></h3>
      <p>If you have found an extremely broken header file which is
         causing problems for you, look carefully before submitting a
         &quot;high&quot; priority bug report (which you probably shouldn't
         do anyhow; see the last paragraph of the page describing
         <a href="http://gcc.gnu.org/bugs.html">the GCC bug database</a>).
      </p>
      <p>If the headers are in <code>${prefix}/include/g++-3</code>, or if
         the installed library's name looks like <code>libstdc++-2.10.a</code>
         or <code>libstdc++-libc6-2.10.so</code>, then you are using the old
         libstdc++-v2 library, which is nonstandard and unmaintained.  Do not
         report problems with -v2 to the -v3 mailing list.
      </p>
      <p>For GCC versions 3.0 and 3.1 the libstdc++-v3 header files are
         installed in <code>${prefix}/include/g++-v3</code> (see the 'v'?).
         Starting with version 3.2 the headers are installed in
         <code>${prefix}/include/c++/${version}</code> as this prevents
         headers from previous versions being found by mistake.
      </p>
      <p><a name="4_4_glibc"><strong>glibc</strong></a>
         If you're on a GNU/Linux system and have just upgraded to
         glibc 2.2, but are still using gcc 2.95.2, then you should have
         read the glibc FAQ, specifically 2.34:
      </p>
      <pre>
2.34.   When compiling C++ programs, I get a compilation error in streambuf.h.

{BH} You are using g++ 2.95.2? After upgrading to glibc 2.2, you need to
apply a patch to the include files in /usr/include/g++, because the fpos_t
type has changed in glibc 2.2.  The patch is at
http://clisp.cons.org/~haible/gccinclude-glibc-2.2-compat.diff
   </pre>
      <p>Note that 2.95.x shipped with the
         <a href="#4_4_interface">old v2 library</a> which is no longer
         maintained.  Also note that gcc 2.95.3 fixes this problem, but
         requires a separate patch for libstdc++-v3.
      </p>
      <p><a name="4_4_checks"><strong>concept checks</strong></a>
         If you see compilation errors containing messages about
         <code> <em>foo</em>Concept </code>and a<code> constraints </code>
         member function, then most likely you have violated one of the
         requirements for types used during instantiation of template
         containers and functions.  For example, EqualityComparableConcept
         appears if your types must be comparable with == and you have not
         provided this capability (a typo, or wrong visibility, or you
         just plain forgot, etc).
      </p>
      <p>More information, including how to optionally enable/disable the
         checks, is available
         <a href="../19_diagnostics/howto.html#3">here</a>.
      </p>
      <p><a name="4_4_dlsym"><strong>dlopen/dlsym</strong></a>
         If you are using the C++ library across dynamically-loaded
         objects, make certain that you are passing the correct options
         when compiling and linking:
      </p>
      <pre>
    // compile your library components
    g++ -fPIC -c a.cc
    g++ -fPIC -c b.cc
    ...
    g++ -fPIC -c z.cc

    // create your library
    g++ -fPIC -shared -rdynamic -o libfoo.so a.o b.o ... z.o

    // link the executable
    g++ -fPIC -rdynamic -o foo ... -L. -lfoo -ldl</pre>
      <p><a name="4_4_leak"><strong>"memory leaks" in containers</strong></a>
         A few people have reported that the standard containers appear
         to leak memory when tested with memory checkers such as
         <a href="http://developer.kde.org/~sewardj/">valgrind</a>.
         The library's default 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
         want to test the library for memory leaks please read
         <a href="../debug.html#mem">Tips for memory leak hunting</a>
         first.
      </p>

<hr />
   <h2><a name="4_5">4.5 Aw, that's easy to fix!</a></h2>
      <p>If you have found a bug in the library and you think you have
         a working fix, then send it in!  The main GCC site has a page
         on <a href="http://gcc.gnu.org/contribute.html">submitting
         patches</a> that covers the procedure, but for libstdc++ you
         should also send the patch to our mailing list in addition to
         the GCC patches mailing list.  The libstdc++
         <a href="../17_intro/contribute.html">contributors' page</a>
         also talks about how to submit patches.
      </p>
      <p>In addition to the description, the patch, and the ChangeLog
         entry, it is a Good Thing if you can additionally create a small
         test program to test for the presence of the bug that your
         patch fixes.  Bugs have a way of being reintroduced; if an old
         bug creeps back in, it will be caught immediately by the
         <a href="#2_4">testsuite</a> -- but only if such a test exists.
      </p>

<hr />
<h1><a name="5_0">5.0 Miscellaneous</a></h1>
   <h2><a name="5_1">5.1 string::iterator is not char*;
                     vector&lt;T&gt;::iterator is not T*</a></h2>
      <p>If you have code that depends on container&lt;T&gt; iterators
         being implemented as pointer-to-T, your code is broken.
      </p>
      <p>While there are arguments for iterators to be implemented in
         that manner, A) they aren't very good ones in the long term,
         and B) they were never guaranteed by the Standard anyway.  The
         type-safety achieved by making iterators a real class rather
         than a typedef for <code>T*</code> outweighs nearly all opposing
         arguments.
      </p>
      <p>Code which does assume that a vector iterator <code> i </code>
         is a pointer can often be fixed by changing <code> i </code> in
         certain expressions to <code> &amp;*i </code>.  Future revisions
         of the Standard are expected to bless this usage for
         vector&lt;&gt; (but not for basic_string&lt;&gt;).
      </p>

<hr />
   <h2><a name="5_2">5.2 What's next after libstdc++-v3?</a></h2>
      <p>Hopefully, not much.  The goal of libstdc++-v3 is to produce
         a fully-compliant, fully-portable Standard Library.  After that,
         we're mostly done:  there won't <em>be</em> any more compliance
         work to do.  However:
      </p>
      <ol>
      <li><p>The ISO Committee will meet periodically to review Defect Reports
         in the C++ Standard.  Undoubtedly some of these will result in
         changes to the Standard, which will be reflected in patches to
         libstdc++.  Some of that is already happening, see 4.2.  Some of
         those changes are being predicted by the library maintainers, and
         we add code to the library based on what the current proposed
         resolution specifies.  Those additions are listed in
         <a href="../ext/howto.html#5">the extensions page</a>.
      </p></li>
      <li><p>Performance tuning.  Lots of performance tuning.  This too is
         already underway for post-3.0 releases, starting with memory
         expansion in container classes and buffer usage in synchronized
         stream objects.
      </p></li>
      <li><p>An ABI for libstdc++ is being developed, so that
         multiple binary-incompatible copies of the library can be replaced
         with a single backwards-compatible library, like libgcc_s.so is.
      </p></li>
      <li><p>The current libstdc++ contains extensions to the Library which
         must be explicitly requested by client code (for example, the
         hash tables from SGI).  Other extensions may be added to
         libstdc++-v3 if they seem to be &quot;standard&quot; enough.
         (For example, the &quot;long long&quot; type from C99.)
         Bugfixes and rewrites (to improve or fix thread safety, for
         instance) will of course be a continuing task.
      </p></li>
      </ol>
      <p><a href="http://gcc.gnu.org/ml/libstdc++/1999/msg00080.html">This
         question</a> about the next libstdc++ prompted some brief but
         interesting
         <a href="http://gcc.gnu.org/ml/libstdc++/1999/msg00084.html">speculation</a>.
      </p>

<hr />
   <h2><a name="5_3">5.3 What about the STL from SGI?</a></h2>
      <p>The <a href="http://www.sgi.com/tech/stl/">STL from SGI</a>,
         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.
      </p>
      <p>In particular, <code>string</code> is not from SGI and makes no
         use of their &quot;rope&quot; class (which is included as an
         optional extension), nor is <code>valarray</code> and some others.
         Classes like <code>vector&lt;&gt;</code> are, however we have
         made significant changes to them since then.
      </p>
      <p>The FAQ for SGI's STL (one jump off of their main page) is
         recommended reading.
      </p>

<hr />
   <h2><a name="5_4">5.4 Extensions and Backward Compatibility</a></h2>
      <p>Headers in the <code>ext</code> and <code>backward</code>
         subdirectories should be referred to by their relative paths:
         <!-- Careful, the leading spaces in PRE show up directly. -->
      </p>
      <pre>
      #include &lt;ext/hash_map&gt; </pre>
      <p>rather than using <code>-I</code> or other options.  This is more
         portable and forward-compatible.  (The situation is the same as
         that of other headers whose directories are not searched directly,
         e.g., <code>&lt;sys/stat.h&gt;</code>, <code>&lt;X11/Xlib.h&gt;</code>.
      </p>

      <p>The extensions are no longer in the global or <code>std</code>
         namespaces, instead they are declared in the <code>__gnu_cxx</code>
         namespace. For maximum portability, consider defining a namespace
         alias to use to talk about extensions, e.g.:
      </p>
      <pre>
      #ifdef __GNUC__
      #if __GNUC__ &lt; 3
        #include &lt;hash_map.h&gt;
        namespace Sgi { using ::hash_map; }; // inherit globals
      #else
        #include &lt;ext/hash_map&gt;
        #if __GNUC_MINOR__ == 0
          namespace Sgi = std;               // GCC 3.0
        #else
          namespace Sgi = ::__gnu_cxx;       // GCC 3.1 and later
        #endif
      #endif
      #else      // ...  there are other compilers, right?
        namespace Sgi = std;
      #endif

      Sgi::hash_map&lt;int,int&gt; my_map; </pre>
      <p>This is a bit cleaner than defining typedefs for all the
         instantiations you might need.
      </p>
      <p><strong>Note:</strong> explicit template specializations must
         be declared in the same namespace as the original template.
         This means you cannot use a namespace alias when declaring
         an explicit specialization.
      </p>
      <p>Extensions to the library have
         <a href="../ext/howto.html">their own page</a>.
      </p>

<hr />
   <h2><a name="5_5">5.5 [removed]</a></h2>
      <p>This question has become moot and has been removed.  The stub
         is here to preserve numbering (and hence links/bookmarks).
      </p>

<hr />
   <h2><a name="5_6">5.6 Is libstdc++-v3 thread-safe?</a></h2>
      <p>libstdc++-v3 strives to be thread-safe when all of the following
         conditions are met:
      </p>
      <ul>
       <li>The system's libc is itself thread-safe,</li>
       <li><code>gcc -v</code> reports a thread model other than 'single',</li>
       <li>[pre-3.3 only] a non-generic implementation of atomicity.h
           exists for the architecture in question.</li>
      </ul>
      <p>The user-code must guard against concurrent method calls which may
         access any particular library object's state.  Typically, the
         application programmer may infer what object locks must be held
         based on the objects referenced in a method call.  Without getting
         into great detail, here is an example which requires user-level
         locks:
      </p>
      <pre>
     library_class_a shared_object_a;

     thread_main () {
       library_class_b *object_b = new library_class_b;
       shared_object_a.add_b (object_b);   // must hold lock for shared_object_a
       shared_object_a.mutate ();          // must hold lock for shared_object_a
     }

     // Multiple copies of thread_main() are started in independent threads.</pre>
      <p>Under the assumption that object_a and object_b are never exposed to
         another thread, here is an example that should not require any
         user-level locks:
      </p>
      <pre>
     thread_main () {
       library_class_a object_a;
       library_class_b *object_b = new library_class_b;
       object_a.add_b (object_b);
       object_a.mutate ();
     } </pre>
      <p>All library objects are safe to use in a multithreaded program as
         long as each thread carefully locks out access by any other
         thread while it uses any object visible to another thread, i.e.,
         treat library objects like any other shared resource.  In general,
         this requirement includes both read and write access to objects;
         unless otherwise documented as safe, do not assume that two threads
         may access a shared standard library object at the same time.
      </p>
      <p>See chapters <a href="../17_intro/howto.html#3">17</a> (library
         introduction), <a href="../23_containers/howto.html#3">23</a>
         (containers), and <a href="../27_io/howto.html#9">27</a> (I/O) for
         more information.
      </p>

<hr />
   <h2><a name="5_7">5.7 How do I get a copy of the ISO C++ Standard?</a></h2>
      <p>Copies of the full ISO 14882 standard are available on line via the
         ISO mirror site for committee members.  Non-members, or those who
         have not paid for the privilege of sitting on the committee and
         sustained their two-meeting commitment for voting rights, may get a
         copy of the standard from their respective national standards
         organization.  In the USA, this national standards organization is
         ANSI and their website is right <a href="http://www.ansi.org">here</a>.
         (And if you've already registered with them, clicking this link will
         take you to directly to the place where you can
<a href="http://webstore.ansi.org/ansidocstore/product.asp?sku=ISO%2FIEC+14882%3A2003">buy
         the standard on-line</a>.
      </p>
      <p>Who is your country's member body?  Visit the
         <a href="http://www.iso.ch/">ISO homepage</a> and find out!
      </p>

<hr />
   <h2><a name="5_8">5.8 What's an ABI and why is it so messy?</a></h2>
      <p>&quot;ABI&quot; stands for &quot;Application Binary Interface.&quot;
         Conventionally, it refers to a great mass of details about how
         arguments are arranged on the call stack and/or in registers, and
         how various types are arranged and padded in structs.  A single CPU
         design may suffer multiple ABIs designed by different development
         tool vendors who made different choices, or even by the same vendor
         for different target applications or compiler versions.  In ideal
         circumstances the CPU designer presents one ABI and all the OSes and
         compilers use it.  In practice every ABI omits details that compiler
         implementers (consciously or accidentally) must choose for themselves.
      </p>
      <p>That ABI definition suffices for compilers to generate code so a
         program can interact safely with an OS and its lowest-level libraries.
         Users usually want an ABI to encompass more detail, allowing libraries
         built with different compilers (or different releases of the same
         compiler!) to be linked together.  For C++, this includes many more
         details than for C, and CPU designers (for good reasons elaborated
         below) have not stepped up to publish C++ ABIs.  The details include
         virtual function implementation, struct inheritance layout, name
         mangling, and exception handling.  Such an ABI has been defined for
         GNU C++, and is immediately useful for embedded work relying only on
         a &quot;free-standing implementation&quot; that doesn't include (much
         of) the standard library.  It is a good basis for the work to come.
      </p>
      <p>A useful C++ ABI must also incorporate many details of the standard
         library implementation.  For a C ABI, the layouts of a few structs
         (such as FILE, stat, jmpbuf, and the like) and a few macros suffice.
         For C++, the details include the complete set of names of functions
         and types used, the offsets of class members and virtual functions,
         and the actual definitions of all inlines.  C++ exposes many more
         library details to the caller than C does.  It makes defining
         a complete ABI a much bigger undertaking, and requires not just
         documenting library implementation details, but carefully designing
         those details so that future bug fixes and optimizations don't
         force breaking the ABI.
      </p>
      <p>There are ways to help isolate library implementation details from the
         ABI, but they trade off against speed.  Library details used in
         inner loops (e.g., getchar) must be exposed and frozen for all
         time, but many others may reasonably be kept hidden from user code,
         so they may later be changed.  Deciding which, and implementing
         the decisions, must happen before you can reasonably document a
         candidate C++ ABI that encompasses the standard library.
      </p>

<hr />
   <h2><a name="5_9">5.9 How do I make std::vector&lt;T&gt;::capacity()
                     == std::vector&lt;T&gt;::size()?</a> </h2>
   <!-- referenced by 21_strings/howto.html#6 -->
   <p>The standard idiom for deallocating a <code>std::vector&lt;T&gt;</code>'s
      unused memory is to create a temporary copy of the vector and swap their
      contents, e.g. for <code>std::vector&lt;T&gt; v</code>
   </p>
   <pre>
     std::vector&lt;T&gt;(v).swap(v);
   </pre>
   <p>The copy will take O(n) time and the swap is constant time.
   </p>
   <p>See <a href='../21_strings/howto.html#6'>Shrink-to-fit strings</a> for
      a similar solution for strings.
   </p>

<!-- ####################################################### -->

<hr />
<p class="fineprint"><em>
See <a href="../17_intro/license.html">license.html</a> for copying conditions.
Comments and suggestions are welcome, and may be sent to
<a href="mailto:libstdc++@gcc.gnu.org">the libstdc++ mailing list</a>.
</em></p>


</body>
</html>

