<div dir="ltr"><div dir="ltr"><div class="gmail_quote"><div dir="ltr">On Thu, Nov 15, 2018 at 11:51 PM Matthew Urquhart via cfe-dev <<a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div style="font-size:1rem;color:rgb(49,49,49);word-spacing:1px" dir="auto">Hiya,</div><div style="color:rgb(49,49,49);word-spacing:1px" dir="auto"><br></div><div style="font-size:1rem;color:rgb(49,49,49);word-spacing:1px" dir="auto">When initialising class members with braces, it seems Clang doesn't have the same behaviour as GCC/MSVC. GCC and MSVC try to use the initializer-list-constructor if defined, where Clang appears to be using the copy-constructor.</div><div style="color:rgb(49,49,49);word-spacing:1px" dir="auto"><br></div><div style="font-size:1rem;color:rgb(49,49,49);word-spacing:1px" dir="auto">My guess is that copy elision is what might be causing this behaviour. Is it correct, or is this a bug?</div></blockquote><div><a href="https://clang.llvm.org/cxx_dr_status.html#2137">https://clang.llvm.org/cxx_dr_status.html#2137</a><br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div style="color:rgb(49,49,49);word-spacing:1px" dir="auto"><br></div><div style="font-size:1rem;color:rgb(49,49,49);word-spacing:1px" dir="auto">For the way I'm using it, the initializer-list-constructor behaves quite differently to the copy-constructor and triggered completely different behaviour between Clang and the other compilers.</div><div style="color:rgb(49,49,49);word-spacing:1px" dir="auto"><br></div><div style="font-size:1rem;color:rgb(49,49,49);word-spacing:1px" dir="auto">Super keen to hear any thoughts.<br></div><div style="color:rgb(49,49,49);word-spacing:1px" dir="auto"><br></div><div style="font-size:1rem;color:rgb(49,49,49);word-spacing:1px" dir="auto">Cheers,</div><div style="font-size:1rem;color:rgb(49,49,49);word-spacing:1px" dir="auto">Matt<br></div><div style="color:rgb(49,49,49);word-spacing:1px" dir="auto"><br></div><div style="font-size:1rem;color:rgb(49,49,49);word-spacing:1px" dir="auto">Repro case:<br></div><div style="color:rgb(49,49,49);word-spacing:1px" dir="auto"><br></div><div style="font-size:1rem;color:rgb(49,49,49);word-spacing:1px" dir="auto">struct ContainedObj {</div><span style="color:rgb(49,49,49);word-spacing:1px;background-color:rgb(255,255,255)">    ContainedObj() = default;</span><br style="color:rgb(49,49,49);word-spacing:1px"><span style="color:rgb(49,49,49);word-spacing:1px;background-color:rgb(255,255,255)">    ContainedObj(ContainedObj const& other) { std::cout << this << ": copy ctor" << std::endl; }</span><br style="color:rgb(49,49,49);word-spacing:1px"><span style="color:rgb(49,49,49);word-spacing:1px;background-color:rgb(255,255,255)">    ContainedObj(std::initializer_</span><span style="color:rgb(49,49,49);word-spacing:1px;background-color:rgb(255,255,255)">list<ContainedObj>) { std::cout << this << ": il ctor" << std::endl; }</span><br style="color:rgb(49,49,49);word-spacing:1px"><span style="color:rgb(49,49,49);word-spacing:1px;background-color:rgb(255,255,255)">};</span><br style="color:rgb(49,49,49);word-spacing:1px"><br style="color:rgb(49,49,49);word-spacing:1px"><span style="color:rgb(49,49,49);word-spacing:1px;background-color:rgb(255,255,255)">struct WithBraces {</span><br style="color:rgb(49,49,49);word-spacing:1px"><span style="color:rgb(49,49,49);word-spacing:1px;background-color:rgb(255,255,255)">    ContainedObj mContained;</span><br style="color:rgb(49,49,49);word-spacing:1px"><span style="color:rgb(49,49,49);word-spacing:1px;background-color:rgb(255,255,255)">    explicit WithBraces(ContainedObj const& contained) : mContained{contained} {}</span><br style="color:rgb(49,49,49);word-spacing:1px"><span style="color:rgb(49,49,49);word-spacing:1px;background-color:rgb(255,255,255)">};</span><br style="color:rgb(49,49,49);word-spacing:1px"><br style="color:rgb(49,49,49);word-spacing:1px"><span style="color:rgb(49,49,49);word-spacing:1px;background-color:rgb(255,255,255)">struct WithBrackets {</span><br style="color:rgb(49,49,49);word-spacing:1px"><span style="color:rgb(49,49,49);word-spacing:1px;background-color:rgb(255,255,255)">    ContainedObj mContained;</span><br style="color:rgb(49,49,49);word-spacing:1px"><span style="color:rgb(49,49,49);word-spacing:1px;background-color:rgb(255,255,255)">    explicit WithBrackets(ContainedObj const& contained) : mContained(contained) {}</span><br style="color:rgb(49,49,49);word-spacing:1px"><span style="color:rgb(49,49,49);word-spacing:1px;background-color:rgb(255,255,255)">};</span><br style="color:rgb(49,49,49);word-spacing:1px"><br style="color:rgb(49,49,49);word-spacing:1px"><span style="color:rgb(49,49,49);word-spacing:1px;background-color:rgb(255,255,255)">ContainedObj a;</span><br style="color:rgb(49,49,49);word-spacing:1px"><span style="color:rgb(49,49,49);word-spacing:1px;background-color:rgb(255,255,255)">WithBrackets b(a);</span><br style="color:rgb(49,49,49);word-spacing:1px"><span style="color:rgb(49,49,49);word-spacing:1px;background-color:rgb(255,255,255)">WithBrackets c{a};</span><br style="color:rgb(49,49,49);word-spacing:1px"><span style="color:rgb(49,49,49);word-spacing:1px;background-color:rgb(255,255,255)">WithBraces d(a);</span><br style="color:rgb(49,49,49);word-spacing:1px"><div style="font-size:1rem;color:rgb(49,49,49);word-spacing:1px" dir="auto">WithBraces e{a};</div><div style="color:rgb(49,49,49);word-spacing:1px" dir="auto"><br></div><div style="font-size:1rem;color:rgb(49,49,49);word-spacing:1px" dir="auto">Output on MSVC 2017 and g++ 6.3.0:<br></div><div style="font-size:1rem;color:rgb(49,49,49);word-spacing:1px" dir="auto">00F3FA6B: copy ctor</div><div style="font-size:1rem;color:rgb(49,49,49);word-spacing:1px" dir="auto">00F3FA5F: copy ctor</div><div style="font-size:1rem;color:rgb(49,49,49);word-spacing:1px" dir="auto">00F3F887: copy ctor</div><div style="font-size:1rem;color:rgb(49,49,49);word-spacing:1px" dir="auto">00F3FAF3: il ctor</div><div style="font-size:1rem;color:rgb(49,49,49);word-spacing:1px" dir="auto">00F3F887: copy ctor</div><div style="font-size:1rem;color:rgb(49,49,49);word-spacing:1px" dir="auto">00F3FA47: il ctor<br></div><div style="color:rgb(49,49,49);word-spacing:1px" dir="auto"><br></div><div style="font-size:1rem;color:rgb(49,49,49);word-spacing:1px" dir="auto">Clang output:</div><div style="font-size:1rem;color:rgb(49,49,49);word-spacing:1px" dir="auto">0x7ffeefbff580: copy ctor<br>0x7ffeefbff578: copy ctor<br>0x7ffeefbff570: copy ctor<br>0x7ffeefbff568: copy ctor</div>
_______________________________________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev</a><br>
</blockquote></div></div></div>