<div dir="ltr">Here's what I think is happening:<div><br></div><div>function foo(B) requires B to have a copy constructor because it's passing by value.<br></div><div><br></div><div>foo(0) invokes B's int constructor. It's working as implicit conversion constructor from int because it isn't marked as explicit. This temporary is an r-value and you can't bind a non-const reference to it. So const copy constructor works, non-const doesn't.</div><div><br></div><div>Now I have no idea what gcc is doing, but I don't think that having A makes any difference at all. Note that I don't really know the exact rules here, but the error clang reports looks reasonable.</div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, May 5, 2015 at 11:07 PM, Chakshu Grover <span dir="ltr"><<a href="mailto:chakshu.gro@samsung.com" target="_blank">chakshu.gro@samsung.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">





<div>
<p>Hi all,<br>This is regarding this program<br><br>#include <string><br>#include <iostream></p>
<p>struct A {<br>  A(){};<br>  A(const A &) { std::cout << "A's Copy Constructor" << std::endl; }<br>};</p>
<p>struct B : A<br>{<br>  B(int) { std::cout << "Constructor" << std::endl; }<br>  B(const B &) { std::cout << "Copy Constructor" << std::endl; }<br>  B(A) { std::cout << "Special Constructor" << std::endl; }<br>};</p>
<p>void foo(B){}</p>
<p>int main()<br>{<br>  foo(0);<br>  return 0;<br>}</p>
<p> </p>
<p>The output of this program is<br></p>
<p>Constructor</p>
<p> </p>
<p>using both gcc and clang<br><br>But if the program is slightly different ("const" missing from B's copy constructor) <br><br>#include <string><br>#include <iostream></p>
<p>struct A {<br>  A(){};<br>  A(const A &) { std::cout << "A's Copy Constructor" << std::endl; }<br>};</p>
<p>struct B : A<br>{<br>  B(int) { std::cout << "Constructor" << std::endl; }<br>  B(B &) { std::cout << "Copy Constructor" << std::endl; }<br>  B(A) { std::cout << "Special Constructor" << std::endl; }<br>};</p>
<p>void foo(B){}</p>
<p>int main()<br>{<br>  foo(0);<br>  return 0;<br>}<br><br>Output of gcc is<br></p>
<p>Constructor</p>
<p>A's Copy Constructor</p>
<p>Special Constructor</p>
<p><br>Clang doesn't compile giving error </p>
<p>"no viable constructor copying parameter of type 'B' "<br><br>My previous understanding was that gcc tried to use B's copy constructor but as it has non constant reference argument so it uses A's copy constructor but even after adding the "const", I see that "Copy Constructor" is still not printed.<br>Clang is unable to compile that means it is not even trying to do it using B(A) constructor when const is not present. When it is, then also "Copy Constructor" is not printed.<br><br>Please suggest where I might be wrong and why I am observing this behavior.<br>Any leads will be helpful<br><br>Regards,<br>Chakshu</p>
<table>
<tbody>
<tr>
<td>
<p><img border="0" src="cid:4CBBEM6S04A2@namo.co.kr"></p></td></tr></tbody></table></div><img src="http://ext.samsung.net/mailcheck/SeenTimeChecker?do=fe69aed3ab8a86cab546ee734f6ade8e3cf926662d15d74741c8c4d357c4447bc400edea8930898a434c6ebf74e200ff220d3e02ce1cb961d6250c6ef56fc7aacf878f9a26ce15a0" border="0" width="0" height="0"><br>_______________________________________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@cs.uiuc.edu">cfe-dev@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev</a><br>
<br></blockquote></div><br></div>