<div dir="ltr">I think I got something relevant: Do these words make any sense in our context?<div><br><div><div><div>An allocation or deallocation function for a class is odr-used by a</div><div>new expression appearing in a potentially-evaluated expression as specified in 5.3.4(New) and 12.5(Free store). A deallocation function for a class is odr-used by a delete expression appearing in a potentially-evaluated expression as specified in 5.3.5(Delete) and 12.5(Free store).</div>
</div><div><br></div><div>What exactly does one mean by saying that something is odr-used?</div></div></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Tue, Nov 26, 2013 at 11:10 PM, David Blaikie <span dir="ltr"><<a href="mailto:dblaikie@gmail.com" target="_blank">dblaikie@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">I'm not sure this is quite the right wording (I was expecting something that used the term "odr-used"), but:<br>
<br>5.3.4p17 states "... If the new expression creates an array of objects of class type, access and ambiguity control are done for the destructor"</div><div class="HOEnZb"><div class="h5">
<div class="gmail_extra"><br><br><div class="gmail_quote">On Tue, Nov 26, 2013 at 6:42 AM, Rahul Jain <span dir="ltr"><<a href="mailto:1989.rahuljain@gmail.com" target="_blank">1989.rahuljain@gmail.com</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div><div><div><div><div><div><div>Hi David, Halfdan,<br><br><br></div>Thanks a lot for your valuable inputs. Got caught up in some personal work so couldnt reply <br>

</div>before.<br><br></div>I tried tracking down the exact wordings to confirm the behaviour, but was of no luck. <br>
<br></div><div>We are basically putting a restriction on dynamic allocation of an array of objects by <br></div><div>marking the destructor of that class as deleted. <br></div><div><div><br></div><div>The standard says:<br>

A program that refers to a deleted function implicitly or explicitly, other than to declare it, is ill-formed.<br>
<br></div></div><span name="Halfdan Ingvarsson">Please if you could help nail down the exact behaviour with reference to the standard??<br></span></div><span name="Halfdan Ingvarsson">Would be of great help!<br>
<br></span></div><span name="Halfdan Ingvarsson">Thanks,<br></span></div><span name="Halfdan Ingvarsson">Rahul<br></span></div><div><div><div class="gmail_extra"><br><br><div class="gmail_quote">
On Thu, Nov 14, 2013 at 2:45 AM, David Blaikie <span dir="ltr"><<a href="mailto:dblaikie@gmail.com" target="_blank">dblaikie@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote"><div>On Wed, Nov 13, 2013 at 12:22 PM, Rahul Jain <span dir="ltr"><<a href="mailto:1989.rahuljain@gmail.com" target="_blank">1989.rahuljain@gmail.com</a>></span> wrote:<br>



<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Thanks David, Halfdan for your valuable inputs.<div>Just need some more clarification so that I get the complete thing.</div>



<div> <div><br></div><div>Yes I understood that when we new[] an array of objects and the constructor of one of the objects throws, the already constructed objects should be destructed as the complete array construction could not get through successfully.</div>




<div><br></div><div>But assume if the constructor is not throwing, and all the objects of the array get constructed completely, than where does the need of the destructor call arise from? </div><div><br></div><div>Is it the possibility of a runtime throw which prevents the compiler from compiling a deleted destructor definition in case of an array allocation?</div>



</div></div></blockquote><div><br></div></div><div>Precisely - whether or not an exception occurs is a runtime property, so the compiler can't know whether it will happen and needs to emit the code to handle it regardless.</div>


<div>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>
<div><br></div><div>Also what exactly is the difference in this context when we define a default constructor in our class vs a synthesized default constructor in our class?</div></div></div></blockquote><div><br></div></div>


<div>
It's possible that GCC is just being lazy, or that there's a requirement that the default ctor is 'nothrow' then no dtors need be called.</div><div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">



<div dir="ltr"><div>g++ seems to accept the synthesized version whereas errors when one defines a default constructor(as Halfsan mentioned above), whereas clang rejects both the versions. Who is at fault here? <br></div>


</div>
</blockquote><div><br></div></div><div>I'd have to go track down the wording. I don't know off hand.</div><div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">



<div dir="ltr"><div></div>
<div><br></div><div>Thanks,</div><div>Rahul</div><div><br></div></div><div><div><div class="gmail_extra"><br><br><div class="gmail_quote">On Thu, Nov 14, 2013 at 12:22 AM, Halfdan Ingvarsson <span dir="ltr"><<a href="mailto:halfdan@sidefx.com" target="_blank">halfdan@sidefx.com</a>></span> wrote:<br>




<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div>On 13-11-13 01:39 PM, Rahul Jain wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
But why will the destructor get called if the array is not explicitly deleted?<br>
</blockquote>
<br></div>
Because if you new[] an array of objects, and the constructor of one of the objects throws an exception, then the already constructed objects will get destructed (destroyed?).<br>
<br>
Example:<br>
#include <iostream><div><br>
<br>
int i = 0;<br>
struct A<br>
{<br></div>
    A() { id = i++; if(id == 5) throw std::exception(); }<br>
    ~A() { std::cout << "Destroying " << id << "\n"; }<br>
<br>
    int id;<br>
};<br>
<br>
int main()<br>
{<br>
    try<br>
    {<br>
    A *a = new A[10];<br>
    }<br>
    catch(...) {}<br>
    return 0;<br>
}<br>
<br>
 - ½<br>
<br>
</blockquote></div><br></div>
</div></div></blockquote></div></div><br></div></div>
</blockquote></div><br></div>
</div></div></blockquote></div><br></div>
</div></div></blockquote></div><br></div>