<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On 13 September 2014 06:52, John Zwinck <span dir="ltr">&lt;<a href="mailto:jzwinck@gmail.com" target="_blank">jzwinck@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr"><span style="font-family:arial,sans-serif;font-size:12.8000001907349px">I recently happened upon some code which, boiled down to its essence, was like this:</span><div style="font-family:arial,sans-serif;font-size:12.8000001907349px"><br></div><div style="font-family:arial,sans-serif;font-size:12.8000001907349px"><pre style="white-space:pre-wrap;margin-top:0px;margin-bottom:10px;padding:5px;border:0px;font-size:13.6000003814697px;vertical-align:baseline;font-family:Consolas,Menlo,Monaco,&#39;Lucida Console&#39;,&#39;Liberation Mono&#39;,&#39;DejaVu Sans Mono&#39;,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,monospace,serif;overflow:auto;width:auto;max-height:600px;word-wrap:normal;color:rgb(0,0,0);line-height:17.8048000335693px;background:rgb(238,238,238)"><code style="margin:0px;padding:0px;border:0px;font-size:13.6000003814697px;vertical-align:baseline;font-family:Consolas,Menlo,Monaco,&#39;Lucida Console&#39;,&#39;Liberation Mono&#39;,&#39;DejaVu Sans Mono&#39;,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,monospace,serif;white-space:inherit;background-image:initial;background-repeat:initial"><span style="margin:0px;padding:0px;border:0px;font-size:13.6000003814697px;vertical-align:baseline;color:rgb(0,0,139);background:transparent">  for</span><span style="margin:0px;padding:0px;border:0px;font-size:13.6000003814697px;vertical-align:baseline;background:transparent"> </span><span style="margin:0px;padding:0px;border:0px;font-size:13.6000003814697px;vertical-align:baseline;background:transparent">(</span><span style="margin:0px;padding:0px;border:0px;font-size:13.6000003814697px;vertical-align:baseline;color:rgb(0,0,139);background:transparent">int</span><span style="margin:0px;padding:0px;border:0px;font-size:13.6000003814697px;vertical-align:baseline;background:transparent"> ii </span><span style="margin:0px;padding:0px;border:0px;font-size:13.6000003814697px;vertical-align:baseline;background:transparent">=</span><span style="margin:0px;padding:0px;border:0px;font-size:13.6000003814697px;vertical-align:baseline;background:transparent"> </span><span style="margin:0px;padding:0px;border:0px;font-size:13.6000003814697px;vertical-align:baseline;color:rgb(128,0,0);background:transparent">0</span><span style="margin:0px;padding:0px;border:0px;font-size:13.6000003814697px;vertical-align:baseline;background:transparent">;</span><span style="margin:0px;padding:0px;border:0px;font-size:13.6000003814697px;vertical-align:baseline;background:transparent"> ii </span><span style="margin:0px;padding:0px;border:0px;font-size:13.6000003814697px;vertical-align:baseline;background:transparent">&lt;</span><span style="margin:0px;padding:0px;border:0px;font-size:13.6000003814697px;vertical-align:baseline;background:transparent"> </span><span style="margin:0px;padding:0px;border:0px;font-size:13.6000003814697px;vertical-align:baseline;color:rgb(128,0,0);background:transparent">1</span><span style="margin:0px;padding:0px;border:0px;font-size:13.6000003814697px;vertical-align:baseline;background:transparent">;</span><span style="margin:0px;padding:0px;border:0px;font-size:13.6000003814697px;vertical-align:baseline;background:transparent"> </span><span style="margin:0px;padding:0px;border:0px;font-size:13.6000003814697px;vertical-align:baseline;background:transparent">++</span><span style="margin:0px;padding:0px;border:0px;font-size:13.6000003814697px;vertical-align:baseline;background:transparent">ii</span><span style="margin:0px;padding:0px;border:0px;font-size:13.6000003814697px;vertical-align:baseline;background:transparent">)</span><span style="margin:0px;padding:0px;border:0px;font-size:13.6000003814697px;vertical-align:baseline;background:transparent">
  </span><span style="margin:0px;padding:0px;border:0px;font-size:13.6000003814697px;vertical-align:baseline;background:transparent">{</span><span style="margin:0px;padding:0px;border:0px;font-size:13.6000003814697px;vertical-align:baseline;background:transparent">
    </span><span style="margin:0px;padding:0px;border:0px;font-size:13.6000003814697px;vertical-align:baseline;color:rgb(0,0,139);background:transparent">const</span><span style="margin:0px;padding:0px;border:0px;font-size:13.6000003814697px;vertical-align:baseline;background:transparent"> std</span><span style="margin:0px;padding:0px;border:0px;font-size:13.6000003814697px;vertical-align:baseline;background:transparent">::</span><span style="margin:0px;padding:0px;border:0px;font-size:13.6000003814697px;vertical-align:baseline;color:rgb(0,0,139);background:transparent">string</span><span style="margin:0px;padding:0px;border:0px;font-size:13.6000003814697px;vertical-align:baseline;background:transparent">&amp;</span><span style="margin:0px;padding:0px;border:0px;font-size:13.6000003814697px;vertical-align:baseline;background:transparent"> str </span><span style="margin:0px;padding:0px;border:0px;font-size:13.6000003814697px;vertical-align:baseline;background:transparent">=</span><span style="margin:0px;padding:0px;border:0px;font-size:13.6000003814697px;vertical-align:baseline;background:transparent"> str</span><span style="margin:0px;padding:0px;border:0px;font-size:13.6000003814697px;vertical-align:baseline;background:transparent">;</span><span style="margin:0px;padding:0px;border:0px;font-size:13.6000003814697px;vertical-align:baseline;background:transparent"> </span><span style="margin:0px;padding:0px;border:0px;font-size:13.6000003814697px;vertical-align:baseline;color:rgb(128,128,128);background:transparent">// !!</span><span style="margin:0px;padding:0px;border:0px;font-size:13.6000003814697px;vertical-align:baseline;background:transparent">
    std</span><span style="margin:0px;padding:0px;border:0px;font-size:13.6000003814697px;vertical-align:baseline;background:transparent">::</span><span style="margin:0px;padding:0px;border:0px;font-size:13.6000003814697px;vertical-align:baseline;background:transparent">cout </span><span style="margin:0px;padding:0px;border:0px;font-size:13.6000003814697px;vertical-align:baseline;background:transparent">&lt;&lt;</span><span style="margin:0px;padding:0px;border:0px;font-size:13.6000003814697px;vertical-align:baseline;background:transparent"> str </span><span style="margin:0px;padding:0px;border:0px;font-size:13.6000003814697px;vertical-align:baseline;background:transparent">&lt;&lt;</span><span style="margin:0px;padding:0px;border:0px;font-size:13.6000003814697px;vertical-align:baseline;background:transparent"> std</span><span style="margin:0px;padding:0px;border:0px;font-size:13.6000003814697px;vertical-align:baseline;background:transparent">::</span><span style="margin:0px;padding:0px;border:0px;font-size:13.6000003814697px;vertical-align:baseline;background:transparent">endl</span><span style="margin:0px;padding:0px;border:0px;font-size:13.6000003814697px;vertical-align:baseline;background:transparent">;</span><span style="margin:0px;padding:0px;border:0px;font-size:13.6000003814697px;vertical-align:baseline;background:transparent">
  </span><span style="margin:0px;padding:0px;border:0px;font-size:13.6000003814697px;vertical-align:baseline;background:transparent">}</span></code></pre></div><div style="font-family:arial,sans-serif;font-size:12.8000001907349px">My to my surprise, this code compiled (and produced a segfault at runtime).  I say surprise because I had all warnings enabled (as errors) in GCC 4.7 and 4.9, yet there was no complaint.  I got a good answer from Jonathan Wakely (<a href="http://stackoverflow.com/a/25720743/4323" target="_blank">http://stackoverflow.com/a/25720743/4323</a>) explaining why GCC failed to catch it, but this got me thinking: why does C++ allow this at all?</div><div style="font-family:arial,sans-serif;font-size:12.8000001907349px"><br></div><div style="font-family:arial,sans-serif;font-size:12.8000001907349px">So, a proposal: perhaps in C++17 we could declare that self-initialized references are ill-formed.  I did consider whether this might impact existing code; the only use case that came to mind might be SFINAE, though I surely have never seen it used that way.</div></div></blockquote><div><br></div><div>FYI, this is core issue 504:</div><div><br></div><div><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#504">http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#504</a><br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr"><div style="font-family:arial,sans-serif;font-size:12.8000001907349px">I would appreciate any thoughts on this, and hope I have come to the right place to discuss it.</div><div style="font-family:arial,sans-serif;font-size:12.8000001907349px"></div></div>
<br>_______________________________________________<br>
ub mailing list<br>
<a href="mailto:ub@isocpp.open-std.org">ub@isocpp.open-std.org</a><br>
<a href="http://www.open-std.org/mailman/listinfo/ub" target="_blank">http://www.open-std.org/mailman/listinfo/ub</a><br>
<br></blockquote></div><br></div></div>