<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Issue 2563: LWG 2259 relaxes requirements, perhaps unintentionally</title>
<meta property="og:title" content="Issue 2563: LWG 2259 relaxes requirements, perhaps unintentionally">
<meta property="og:description" content="C++ library issue. Status: NAD">
<meta property="og:url" content="https://cplusplus.github.io/LWG/issue2563.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#NAD">NAD</a> status.</em></p>
<h3 id="2563"><a href="lwg-closed.html#2563">2563</a>. LWG 2259 relaxes requirements, perhaps unintentionally</h3>
<p><b>Section:</b> 16.4.6.5 <a href="https://wg21.link/member.functions">[member.functions]</a> <b>Status:</b> <a href="lwg-active.html#NAD">NAD</a>
 <b>Submitter:</b> Ville Voutilainen <b>Opened:</b> 2015-11-29 <b>Last modified:</b> 2018-11-12</p>
<p><b>Priority: </b>2
</p>
<p><b>View other</b> <a href="lwg-index-open.html#member.functions">active issues</a> in [member.functions].</p>
<p><b>View all other</b> <a href="lwg-index.html#member.functions">issues</a> in [member.functions].</p>
<p><b>View all issues with</b> <a href="lwg-status.html#NAD">NAD</a> status.</p>
<p><b>Discussion:</b></p>
<p>
The combination of 16.4.6.5 <a href="https://wg21.link/member.functions">[member.functions]</a>, paragraphs 2 and 3 that LWG 
<a href="lwg-defects.html#2259" title="Issues in 17.6.5.5 rules for member functions (Status: C++17)">2259</a><sup><a href="https://cplusplus.github.io/LWG/issue2259" title="Latest snapshot">(i)</a></sup> does seems to drop a requirement that any call behaves as if 
no overloads were added. Paragraph 3 used to say
"A call to a member function signature described in the C ++ standard
library behaves as if the implementation
declares no additional member function signatures."
whereas the new wording says
"provided that any call to the member function that would select an
overload from the set of declarations described in this standard
behaves as if that overload were selected."
<p/>
This can be read as meaning that if there's no default constructor
specified, like for instance for <code>std::ostream</code>, an implementation is free to
add it. It can also be read as meaning that an implementation is free to
add any overloads that wouldn't change the overload resolution result
of any call expression that would select a specified overload. That's
vastly different from allowing extensions that add new functions rather
than new overloads.
<p/>
Was this relaxation intentional?
</p>
<p><i>[2016-04, Issues Telecon]</i></p>

<p>
Ville provides a motivating example.
</p>

<p>
<blockquote>
<pre>
#include &lt;iostream&gt;

class my_stream : std::ostream
{
};

int main()
{
    my_stream ms;
}
</pre>
</blockquote>
</p>

<p>This example is accepted by libstdc++, msvc rejects it, and clang+libc++
segfault on melpon.org/wandbox o_O. An earlier clang+libc++ just accepts
it. I don't think the implementation divergence is caused by the acceptance
of the referred-to <a href="lwg-defects.html#2259" title="Issues in 17.6.5.5 rules for member functions (Status: C++17)">2259</a><sup><a href="https://cplusplus.github.io/LWG/issue2259" title="Latest snapshot">(i)</a></sup>, but it certainly seems to increasingly bless
the implementation divergence.
</p>

<p><i>[2016-05 Issues Telecon]</i></p>

<p>
This is related to issue <a href="lwg-active.html#2695" title="&quot;As if&quot; unclear in [member.functions] (Status: New)">2695</a><sup><a href="https://cplusplus.github.io/LWG/issue2695" title="Latest snapshot">(i)</a></sup>.
</p>

<p><i>[2018-08 Batavia Monday issue discussion]</i></p>

<p>Ville to provide wording.</p>
<p><i>[2018-08 Batavia Monday issue discussion]</i></p>

<p>Ville recommends NAD; because closing this would outlaw conforming extensions.</p>

<p><i>[2018-11 San Diego Thursday night issue processing]</i></p>

<p>Status to NAD</p>


<p id="res-2563"><b>Proposed resolution:</b></p>





</body>
</html>
