<html><head><meta http-equiv="Content-Type" content="text/html charset=windows-1252"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;">On Feb 14, 2014, at 4:31 PM, David Blaikie <<a href="mailto:dblaikie@gmail.com">dblaikie@gmail.com</a>> wrote:<br><div><blockquote type="cite"><div class="gmail_extra"><div class="gmail_quote">On Fri, Feb 14, 2014 at 4:21 PM, Marshall Clow <span dir="ltr"><<a href="mailto:mclow.lists@gmail.com" target="_blank">mclow.lists@gmail.com</a>></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; position: static; z-index: auto;">Users can write<br> for(sregex_iterator i(s.begin(), s.end(), regex("meow")), end; i != end; ++i)<br><br>binding a temporary regex to const regex& and storing a pointer to it.<br>This will compile silently, triggering undefined behavior at runtime.<br><br>Fixing this involves defining constructors for the various regex iterator types from rvalue regexes, and then marking them as “deleted”.<br>And tests.<br></blockquote></div></div></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite"><div dir="ltr">Would this break (what I assume is) correct code doing things like:<br><br>std::find(sregex_iterator(s.begin(), s.end(), regex("meow")), end, "foo”); ?</div></blockquote><div><br></div><div>(Recapping a discussion on IRC)</div><div><br></div>Yes, it would.</div><div>And though that code is "technically correct” it (a) is dangerous, and (b) doesn’t do anything useful.</div><div><br></div><div>The return result from std::find is an interator into a destroyed object, so you can’t really do anything with that.</div><div><br></div><div>The “fix” for this code is simple:</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre"> </span>regex re{“meow”}</div><div><div><div dir="ltr"><span class="Apple-tab-span" style="white-space:pre"> </span>std::find(sregex_iterator(s.begin(), s.end(), re), end, "foo”); </div><div dir="ltr"><br></div><div dir="ltr">and now the return value of std::find is valid (until the end of the lifetime of “re”).</div><div dir="ltr"><br></div><div dir="ltr">See </div><div dir="ltr"><span class="Apple-tab-span" style="white-space:pre"> </span><a href="http://cplusplus.github.io/LWG/lwg-active.html#2329">http://cplusplus.github.io/LWG/lwg-active.html#2329</a></div><div dir="ltr">and<span class="Apple-tab-span" style="white-space:pre"> </span><a href="http://cplusplus.github.io/LWG/lwg-active.html#2332">http://cplusplus.github.io/LWG/lwg-active.html#2332</a></div><div><div dir="ltr"><br></div></div><div dir="ltr">for the changes to the (C++14) standard.</div><div dir="ltr"><br></div><div dir="ltr">— Marshall</div><div dir="ltr"><br></div></div></div></body></html>