On 13 September 2014 06:52, John Zwinck <jzwinck@gmail.com> wrote:
I recently happened upon some code which, boiled down to its essence, was like this:

  for (int ii = 0; ii < 1; ++ii)
    const std::string& str = str; // !!
    std::cout << str << std::endl;
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 (http://stackoverflow.com/a/25720743/4323) explaining why GCC failed to catch it, but this got me thinking: why does C++ allow this at all?

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.

FYI, this is core issue 504:

I would appreciate any thoughts on this, and hope I have come to the right place to discuss it.

ub mailing list