<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Issue 847: string exception safety guarantees</title>
<meta property="og:title" content="Issue 847: string exception safety guarantees">
<meta property="og:description" content="C++ library issue. Status: C++11">
<meta property="og:url" content="https://cplusplus.github.io/LWG/issue847.html">
<meta property="og:type" content="website">
<meta property="og:image" content="http://cplusplus.github.io/LWG/images/cpp_logo.png">
<meta property="og:image:alt" content="C++ logo">
<style>
  p {text-align:justify}
  li {text-align:justify}
  pre code.backtick::before { content: "`" }
  pre code.backtick::after { content: "`" }
  blockquote.note
  {
    background-color:#E0E0E0;
    padding-left: 15px;
    padding-right: 15px;
    padding-top: 1px;
    padding-bottom: 1px;
  }
  ins {background-color:#A0FFA0}
  del {background-color:#FFA0A0}
  table.issues-index { border: 1px solid; border-collapse: collapse; }
  table.issues-index th { text-align: center; padding: 4px; border: 1px solid; }
  table.issues-index td { padding: 4px; border: 1px solid; }
  table.issues-index td:nth-child(1) { text-align: right; }
  table.issues-index td:nth-child(2) { text-align: left; }
  table.issues-index td:nth-child(3) { text-align: left; }
  table.issues-index td:nth-child(4) { text-align: left; }
  table.issues-index td:nth-child(5) { text-align: center; }
  table.issues-index td:nth-child(6) { text-align: center; }
  table.issues-index td:nth-child(7) { text-align: left; }
  table.issues-index td:nth-child(5) span.no-pr { color: red; }
  @media (prefers-color-scheme: dark) {
     html {
        color: #ddd;
        background-color: black;
     }
     ins {
        background-color: #225522
     }
     del {
        background-color: #662222
     }
     a {
        color: #6af
     }
     a:visited {
        color: #6af
     }
     blockquote.note
     {
        background-color: rgba(255, 255, 255, .10)
     }
  }
</style>
</head>
<body>
<hr>
<p><em>This page is a snapshot from the LWG issues list, see the <a href="lwg-active.html">Library Active Issues List</a> for more information and the meaning of <a href="lwg-active.html#C++11">C++11</a> status.</em></p>
<h3 id="847"><a href="lwg-defects.html#847">847</a>. string exception safety guarantees</h3>
<p><b>Section:</b> 27.4.3.2 <a href="https://wg21.link/string.require">[string.require]</a> <b>Status:</b> <a href="lwg-active.html#C++11">C++11</a>
 <b>Submitter:</b> Herv&eacute; Br&ouml;nnimann <b>Opened:</b> 2008-06-05 <b>Last modified:</b> 2016-01-28</p>
<p><b>Priority: </b>Not Prioritized
</p>
<p><b>View all other</b> <a href="lwg-index.html#string.require">issues</a> in [string.require].</p>
<p><b>View all issues with</b> <a href="lwg-status.html#C++11">C++11</a> status.</p>
<p><b>Discussion:</b></p>
<p>
In March, on comp.lang.c++.moderated, I asked what were the
string exception safety guarantees are, because I cannot see
*any* in the working paper, and any implementation I know offers
the strong exception safety guarantee (string unchanged if a
member throws exception). The closest the current draft comes to
offering any guarantees is 27.4.3 <a href="https://wg21.link/basic.string">[basic.string]</a>, para 3:
</p>

<blockquote><p>
The class template <code>basic_string</code> conforms to the requirements
for a Sequence Container (23.1.1), for a Reversible Container (23.1),
and for an Allocator-aware container (91). The iterators supported by
<code>basic_string</code> are random access iterators (24.1.5).
</p></blockquote>

<p>
However, the chapter 23 only says, on the topic of exceptions:  23.2 <a href="https://wg21.link/container.requirements">[container.requirements]</a>,
para 10:
</p>

<blockquote>
<p>
Unless otherwise specified (see 23.2.2.3 and 23.2.6.4) all container types defined in this clause meet the following 
additional requirements:
</p>

<ul>
<li>if an exception is thrown by...</li>
</ul>
</blockquote>

<p>
I take it  as saying that this paragraph has *no* implication on
<code>std::basic_string</code>, as <code>basic_string</code> isn't defined in Clause 23 and
this paragraph does not define a *requirement* of Sequence
nor Reversible Container, just of the models defined in Clause 23.
In addition, LWG Issue <a href="lwg-closed.html#718" title="basic_string is not a sequence (Status: NAD Editorial)">718</a><sup><a href="https://cplusplus.github.io/LWG/issue718" title="Latest snapshot">(i)</a></sup> proposes to remove 23.2 <a href="https://wg21.link/container.requirements">[container.requirements]</a>, para 3.
</p>

<p>
Finally, the fact that no operation on Traits should throw
exceptions has no bearing, except to suggest (since the only
other throws should be allocation, <code>out_of_range</code>, or <code>length_error</code>)
that the strong exception guarantee can be achieved.
</p>

<p>
The reaction in that group by Niels Dekker, Martin Sebor, and
Bo Persson, was all that this would be worth an LWG issue.
</p>

<p>
A related issue is that <code>erase()</code> does not throw.  This should be
stated somewhere (and again, I don't think that the 23.2 <a href="https://wg21.link/container.requirements">[container.requirements]</a>, para 1
applies here).
</p>

<p><i>[
San Francisco:
]</i></p>


<blockquote><p>
Implementors will study this to confirm that it is actually possible.
</p></blockquote>

<p><i>[
Daniel adds 2009-02-14:
]</i></p>


<blockquote><p>
The proposed resolution of paper
<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2815.html">N2815</a>
interacts with this issue (the paper does not refer to this issue).
</p></blockquote>

<p><i>[
2009-07 Frankfurt:
]</i></p>


<blockquote><p>
Move to Ready.
</p></blockquote>



<p id="res-847"><b>Proposed resolution:</b></p>
<p>
Add a blanket statement in 27.4.3.2 <a href="https://wg21.link/string.require">[string.require]</a>:
</p>

<blockquote>
<p>
- if any member function or operator of <code>basic_string&lt;charT, traits, Allocator&gt;</code>
throws, that function or operator has no effect.
</p>
<p>
- no <code>erase()</code> or <code>pop_back()</code> function throws.
</p>
</blockquote>

<p>
As far as I can tell, this is achieved by any implementation.  If I made a
mistake and it is not possible to offer this guarantee, then
either state all the functions for which this is possible
(certainly at least <code>operator+=</code>, <code>append</code>, <code>assign</code>, and <code>insert</code>),
or add paragraphs to Effects clauses wherever appropriate.
</p>





</body>
</html>
