import std.stdio; struct Test { int count; this( int x ) { count = x; } this( this ) { writeln("Postblit!"); } typeof(this) opSlice() { return this; } int front() const { return 42; } @property bool empty() const { return count == 0; } void popFront() { --count; } } int main(string[] argv) { auto v = Test(5); foreach( x ; v ) writeln( x ); writeln( "Count: ", v.count ); return 0; } In the code above "Postblit!" doesn't get written, but a copy of v is definitely created since "Count: 5" gets printed. It seems that foreach() calls opSlice and for some reason the returned object gets blitted without calling the postblit ctor (maybe a misguided return value optimization?). Removing the opSlice() definition results in correct behaviour.
With 2.059, the output is: PS E:\DigitalMars\dmd2\samples> rdmd bug Postblit! 42 42 42 42 42 Count: 5 PS E:\DigitalMars\dmd2\samples>
Maybe a dup of 4437. *** This issue has been marked as a duplicate of issue 4437 ***