<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Issue 165: xsputn(), pubsync() never called by basic_ostream members?</title>
<meta property="og:title" content="Issue 165: xsputn(), pubsync() never called by basic_ostream members?">
<meta property="og:description" content="C++ library issue. Status: CD1">
<meta property="og:url" content="https://cplusplus.github.io/LWG/issue165.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#CD1">CD1</a> status.</em></p>
<h3 id="165"><a href="lwg-defects.html#165">165</a>. <code>xsputn()</code>, <code>pubsync()</code> never called by <code>basic_ostream</code> members?</h3>
<p><b>Section:</b> 31.7.6.2 <a href="https://wg21.link/ostream">[ostream]</a> <b>Status:</b> <a href="lwg-active.html#CD1">CD1</a>
 <b>Submitter:</b> Dietmar K&uuml;hl <b>Opened:</b> 1999-07-20 <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#ostream">issues</a> in [ostream].</p>
<p><b>View all issues with</b> <a href="lwg-status.html#CD1">CD1</a> status.</p>
<p><b>Discussion:</b></p>
<p>Paragraph 2 explicitly states that none of the <code>basic_ostream</code>
functions falling into one of the groups &quot;formatted output functions&quot;
and &quot;unformatted output functions&quot; calls any stream buffer function
which might call a virtual function other than <code>overflow()</code>. Basically
this is fine but this implies that <code>sputn()</code> (this function would call
the virtual function <code>xsputn()</code>) is never called by any of the standard
output functions. Is this really intended? At minimum it would be convenient to
call <code>xsputn()</code> for strings... Also, the statement that <code>overflow()</code>
is the only virtual member of <code>basic_streambuf</code> called is in conflict
with the definition of <code>flush()</code> which calls <code>rdbuf()-&gt;pubsync()</code>
and thereby the virtual function <code>sync()</code> (<code>flush()</code> is listed
under &quot;unformatted output functions&quot;).</p>
<p>In addition, I guess that the sentence starting with &quot;They may use other
public members of <code>basic_ostream</code> ...&quot; probably was intended to
start with &quot;They may use other public members of <code>basic_streamuf</code>...&quot;
although the problem with the virtual members exists in both cases.</p>
<p>I see two obvious resolutions:</p>
<ol>
  <li>state in a footnote that this means that <code>xsputn()</code> will never be
    called by any ostream member and that this is intended.</li>
  <li>relax the restriction and allow calling <code>overflow()</code> and <code>xsputn()</code>.
    Of course, the problem with <code>flush()</code> has to be resolved in some way.</li>
</ol>


<p id="res-165"><b>Proposed resolution:</b></p>
<p>Change the last sentence of 27.6.2.1 (lib.ostream) paragraph 2 from:</p>
<blockquote>
  <p>They may use other public members of basic_ostream except that they do not
  invoke any virtual members of rdbuf() except overflow().</p>
</blockquote>
<p>to:</p>
<blockquote>
  <p>They may use other public members of basic_ostream except that they shall
  not invoke any virtual members of rdbuf() except overflow(), xsputn(), and
  sync().</p>
</blockquote>

<p><i>[Kona: the LWG believes this is a problem. Wish to ask Jerry or
PJP why the standard is written this way.]</i></p>


<p><i>[Post-Tokyo: Dietmar supplied wording at the request of the
LWG. He comments: The rules can be made a little bit more specific if
necessary be explicitly spelling out what virtuals are allowed to be
called from what functions and eg to state specifically that flush()
is allowed to call sync() while other functions are not.]</i></p>






</body>
</html>
