Currently, the following code: import std.stdio; struct S { int x; this(this) { writeln("postblit"); } ~this() { writeln("dtor"); } } void main() { S[] arr; arr ~= S(); } outputs: postblit dtor But it could have move semantics. However, the runtime function which appends data does not know whether the given data to append is an rvalue or not. For example, the following cannot have move semantics: S s; s.x = 1; arr ~= s; writeln(s.x); So the compiler must give an additional flag (or call a separate runtime function) when appending an rvalue. When the compiler does this, flip the bug to a druntime bug and assign it to me, and I'll fix the runtime.
Can I assume that this has been fixed? 2.069 outputs only the "dtor" and no postblit.
I think this can be closed. The temporary is no longer destructed. The dtor is called actually by the GC. I tested as far back as 2.067.1