<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Issue 2085: Wrong description of effect 1 of basic_istream::ignore</title>
<meta property="og:title" content="Issue 2085: Wrong description of effect 1 of basic_istream::ignore">
<meta property="og:description" content="C++ library issue. Status: C++14">
<meta property="og:url" content="https://cplusplus.github.io/LWG/issue2085.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++14">C++14</a> status.</em></p>
<h3 id="2085"><a href="lwg-defects.html#2085">2085</a>. Wrong description of effect 1 of <code>basic_istream::ignore</code></h3>
<p><b>Section:</b> 31.7.5.4 <a href="https://wg21.link/istream.unformatted">[istream.unformatted]</a> <b>Status:</b> <a href="lwg-active.html#C++14">C++14</a>
 <b>Submitter:</b> Krzysztof &#379;elechowski <b>Opened:</b> 2011-09-11 <b>Last modified:</b> 2016-08-09</p>
<p><b>Priority: </b>Not Prioritized
</p>
<p><b>View all other</b> <a href="lwg-index.html#istream.unformatted">issues</a> in [istream.unformatted].</p>
<p><b>View all issues with</b> <a href="lwg-status.html#C++14">C++14</a> status.</p>
<p><b>Discussion:</b></p>

<p>
31.7.5.4 <a href="https://wg21.link/istream.unformatted">[istream.unformatted]</a> in N3242 currently has the following to say about the
semantics of <code>basic_istream::ignore</code>:
</p>

<blockquote><p>
[..]. Characters are extracted until any of the following occurs:
</p>
<ul>
<li>if <code>n != numeric_limits&lt;streamsize&gt;::max()</code> (18.3.2), <code>n</code> characters are extracted
</li>
</ul>
</blockquote>

<p>
This statement, apart from being slightly ungrammatical, indicates that if
(<code>n == numeric_limits&lt;streamsize&gt;::max()</code>), the method returns without
extracting any characters.
<p/>
The description intends to describe the observable behaviour of an
implementation in terms of logical assertions.  Logical assertions are not
"bullets" that can be "entered" but need not; they are predicates that can
evaluate to true or false.
<p/>
The description contains two predicates, either of them causes extraction to
terminate.  In the incriminated case, the first predicate is evaluates to
true because its premise is false, therefore no characters will be
extracted.
<p/>
The intended semantics would be described by the following statement:
</p>

<blockquote><p>
[..]. Characters are extracted until any of the following occurs:
</p>
<ul>
<li><code>(n != numeric_limits&lt;streamsize&gt;::max())</code> (18.3.2) and (<code>n</code>) characters
have been extracted so far.
</li>
</ul>
</blockquote>

<p><i>[2013-04-20, Bristol]</i></p>


<p>
Resolution: Ready. 
</p>

<p><i>[2013-09-29, Chicago]</i></p>


<p>
Apply to Working Paper 
</p>


<p id="res-2085"><b>Proposed resolution:</b></p>
<p>This wording is relative to the FDIS.</p>

<p>Change 31.7.5.4 <a href="https://wg21.link/istream.unformatted">[istream.unformatted]</a> p25 as indicated:</p>

<blockquote><pre>
basic_istream&lt;charT,traits&gt;&amp;
  ignore(streamsize n = 1, int_type delim = traits::eof());
</pre><blockquote><p>
-25- <i>Effects</i>: Behaves as an unformatted input function (as described in 31.7.5.4 <a href="https://wg21.link/istream.unformatted">[istream.unformatted]</a>, paragraph 1). After
constructing a <code>sentry</code> object, extracts characters and discards them. Characters are extracted until
any of the following occurs:
</p>
<ul>
<li><del>if</del> <code>n != numeric_limits&lt;streamsize&gt;::max()</code> ( [limits.numeric])<del>,</del><ins>and</ins> 
<code>n</code> characters <del>are</del><ins>have been</ins> extracted <ins>so far</ins>
</li>
<li>end-of-file occurs on the input sequence (in which case the function calls <code>setstate(eofbit)</code>,
which may throw <code>ios_base::failure</code> (31.5.4.4 <a href="https://wg21.link/iostate.flags">[iostate.flags]</a>));
</li>
<li><code>traits::eq_int_type(traits::to_int_type(c), delim)</code> for the next available input character <code>c</code> 
(in which case <code>c</code> is extracted).
</li>
</ul>
</blockquote></blockquote>





</body>
</html>
