~= call copy ctor?
Regan Heath
regan at netmail.co.nz
Fri Jul 20 06:55:36 PDT 2012
On Fri, 20 Jul 2012 14:50:19 +0100, Namespace <rswhite4 at googlemail.com>
wrote:
> New question:
>
> I have this code:
> [code]
> import std.stdio;
>
> struct Test {
> public:
> this(int i = 0) {
> writeln("CTOR");
> }
>
> this(this) {
> writeln("COPY CTOR");
> }
>
> ~this() {
> writeln("DTOR");
> }
> }
>
> void main() {
> Test[] _arr;
>
> _arr ~= Test(0);
>
> writeln("end main");
> }
> [/code]
>
> And as output i see:
>
> CTOR
> COPY CTOR
> DTOR
> end main
>
> Why on earth....?
>
> I create a struct Test. It's not a local variable, it's directly
> assigned,
> but it is copied and the original is destroyed. Why?
Because that's how assignment works, rhs is evaluated, struct is
constructed, then assigned to lhs, lhs copies the variable into the
array. Your variable is a struct, so it is copied. Use a pointer instead
and the pointer is copied into the array. Use a reference and the
reference is copied into the array. The variable, whatever it is, is
/always/ copied into the array.
It's a long standing optimisation issue and the reason for the recent
distinction between lvalues and rvalues made in C++0x for their new 'move'
optimisation where assignments involving rvalues/temporaries can move the
rvalue instead of copying - or something like that, I'm a bit vague having
watched a vid a few days back and not paying a lot of attention to it,
sorry.
Does:
_arr[0] = Test(0);
avoid the copy construction?
R
More information about the Digitalmars-d-learn
mailing list