<html><head><meta http-equiv="Content-Type" content="text/html; charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class="">Concretely, in LLVM, I committed r266909 and r267299 (use SmallVector instead of std::vector) because it didn't make sense to litter an -fno-exceptions code base with `noexcept`.<br class=""><div><br class=""><blockquote type="cite" class=""><div class="">On Apr 17, 2019, at 09:39, Duncan P. N. Exon Smith via libcxx-dev <<a href="mailto:libcxx-dev@lists.llvm.org" class="">libcxx-dev@lists.llvm.org</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><meta http-equiv="Content-Type" content="text/html; charset=us-ascii" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class="">I'm curious about how people feel this should/could behave with -fno-exceptions.  IIRC, Libc++ calls the copy constructor (following the standard), but -fno-exceptions isn't really standard, and from a user perspective that doesn't make sense.  `noexcept` is essentially meaningless with -fno-exceptions.<br class=""><div class=""><br class=""></div><div class="">Thoughts?</div><div class=""><br class=""><blockquote type="cite" class=""><div class="">On Apr 16, 2019, at 23:19, Eric Fiselier via libcxx-dev <<a href="mailto:libcxx-dev@lists.llvm.org" class="">libcxx-dev@lists.llvm.org</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class=""><div dir="ltr" class=""><br class=""></div><br class=""><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Apr 16, 2019 at 2:25 PM Michael Narigon via libcxx-dev <<a href="mailto:libcxx-dev@lists.llvm.org" class="">libcxx-dev@lists.llvm.org</a>> wrote:<br class=""></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">std:vector is using the element copy constructor on existing elements during its resizing operation in reserve(). I would expect it to use the move constructor for efficiency. Is this intended behavior?<br class=""></blockquote><div class=""><br class=""></div><div class="">Yes, this behavior is mandated by the standard. The copy constructor is used when the move constructor is not noexcept. From cppreference's `std::move_if_noexcept` documentation:<br class=""><br class=""></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span class="gmail-t-lc" style="font-size: 12.8px; font-family: DejaVuSansMono, "DejaVu Sans Mono", courier, monospace;"><a href="https://en.cppreference.com/w/cpp/container/vector/resize" title="cpp/container/vector/resize" style="text-decoration-line:none;color:rgb(11,0,128);background:none" class="">std::vector::resize</a></span><span style="font-family: DejaVuSans, "DejaVu Sans", arial, sans-serif; font-size: 12.8px;" class="">, which may have to allocate new storage and then move or copy elements from old storage to new storage.<br class=""></span><span style="font-family: DejaVuSans, "DejaVu Sans", arial, sans-serif; font-size: 12.8px;" class="">If an exception occurs during this operation, </span><span class="gmail-t-lc" style="font-size: 12.8px; font-family: DejaVuSansMono, "DejaVu Sans Mono", courier, monospace;"><a href="https://en.cppreference.com/w/cpp/container/vector/resize" title="cpp/container/vector/resize" style="text-decoration-line:none;color:rgb(11,0,128);background:none" class="">std::vector::resize</a></span><span style="font-family: DejaVuSans, "DejaVu Sans", arial, sans-serif; font-size: 12.8px;" class=""> undoes everything it did to this point, which is only possible if<br class=""></span><code style="font-size: 12.8px; font-family: DejaVuSansMono, "DejaVu Sans Mono", courier, monospace;" class="">std::move_if_noexcept</code><span style="font-family: DejaVuSans, "DejaVu Sans", arial, sans-serif; font-size: 12.8px;" class=""> was used to decide whether to use move construction or copy construction. (unless copy constructor is</span> </blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="font-family: DejaVuSans, "DejaVu Sans", arial, sans-serif; font-size: 12.8px;" class="">not available, in which case move constructor is used either way and the strong exception guarantee may be waived)</span>  </blockquote><div class=""> <a href="https://en.cppreference.com/w/cpp/utility/move_if_noexcept" class="">https://en.cppreference.com/w/cpp/utility/move_if_noexcept</a></div><div class=""><br class=""></div><div class="">If you add `noexcept` to your move constructor, vector should call the move constructor.</div><div class=""><br class=""></div><div class=""><br class=""></div><div class=""> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br class="">
This is with the libc++ delivered with Xcode 10.1.<br class="">
<br class="">
Attached is a sample program displaying the behavior.<br class="">
_______________________________________________<br class="">
libcxx-dev mailing list<br class="">
<a href="mailto:libcxx-dev@lists.llvm.org" target="_blank" class="">libcxx-dev@lists.llvm.org</a><br class="">
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/libcxx-dev" rel="noreferrer" target="_blank" class="">https://lists.llvm.org/cgi-bin/mailman/listinfo/libcxx-dev</a><br class="">
</blockquote></div></div>
_______________________________________________<br class="">libcxx-dev mailing list<br class=""><a href="mailto:libcxx-dev@lists.llvm.org" class="">libcxx-dev@lists.llvm.org</a><br class=""><a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/libcxx-dev" class="">https://lists.llvm.org/cgi-bin/mailman/listinfo/libcxx-dev</a><br class=""></div></blockquote></div><br class=""></div>_______________________________________________<br class="">libcxx-dev mailing list<br class=""><a href="mailto:libcxx-dev@lists.llvm.org" class="">libcxx-dev@lists.llvm.org</a><br class="">https://lists.llvm.org/cgi-bin/mailman/listinfo/libcxx-dev<br class=""></div></blockquote></div><br class=""></body></html>