[Issue 9732] Do not call opAssign() for the first assignment to member in the constructor

d-bugmail at puremagic.com d-bugmail at puremagic.com
Sun Mar 17 07:14:22 PDT 2013


http://d.puremagic.com/issues/show_bug.cgi?id=9732


monarchdodra at gmail.com changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |monarchdodra at gmail.com


--- Comment #3 from monarchdodra at gmail.com 2013-03-17 07:14:20 PDT ---
(In reply to comment #2)
> I think you are right because the .init state of a member may not be as simple
> as one thinks. Although OuterStruct.inner must be known at compile time, it may
> have a non-trivial destructor that needs to be called:
> 
> struct Inner
> {
>     ~this()
>     {
>         // ... not-trivial destructor ...
>     }
> 
>     // ...
> }
> 
> struct OuterStruct
> {
>     Inner inner = Inner(specialInitValue);    // <-- compile-time .init
> 
>     this(int i)
>     {
>         this.inner = Inner(i);    // <-- further assignment
>     }
> }
> 
> Blitting the rvalue on top of OuterStruct.inner would not be right in that
> case.

I really don't think that's a problem. If anything, the default value should
NOT be destroyed in the constructor. After all, it hasn't really even been
initialized yet.

If anything, that's exactly how "aggregate construction" works: postblit each
value over the current fields, but DON'T destroy the fields:

//--------
import std.stdio;

struct Inner
{
    int i;
    this(this){} //Postblit implies destruction of this.
    ~this()
    {
        writeln(i);
    }
}

struct Outer
{
    Inner inner = Inner(1);    // <-- compile-time .init
}

void main()
{
    auto inner = Inner(2);
    {
        writeln("****");
        auto outer = Outer(inner); // Overwrite with postblit, but don't call
destructor.
        writeln("****");
    }
    {
        writeln("****");
        auto outer = Outer(inner); // Overwrite with postblit, but don't call
destructor.
        outer.inner = inner;       // Call postblit, destroying previous state.
        writeln("****");
    }
}
//--------
****
**** //Notice no destroyer called here
2    //This is outer's destroyer destroying its inner
****
2    //This is our second blit.
****
2    //This is out second outer destroyer's destroying its inner
2    //This is our inner's destroyer
//--------

So yeah, my conclusion is: destroyers are not a problem to this proposal.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------


More information about the Digitalmars-d-bugs mailing list