On Wednesday, 22 June 2016 at 08:06:26 UTC, ketmar wrote:
On Wednesday, 22 June 2016 at 06:43:12 UTC, Paul wrote:
Why is initialisation via {} bad (in simple terms please :D)?
first, it is buggy. i.e. it doesn't always call postblit[1].
second, it's syntax is the same as the syntax of argument-less
lambda, which makes it context-dependent -- so reader has to
make some mental efforts to find out if it is really lambda or
struct initialization.
for me, it is enough to see it as bad. and for some other
people too. ;-)
[1] https://issues.dlang.org/show_bug.cgi?id=16146
On the other hand I don't see why you'd expect {} to call
postblit at
all. Postblit is meant for copy construction while here (with {})
there is no copy, just an initialization. And actually the
"verbose"
way doesn't call postblit either:
import std.stdio;
struct Coord {
int x, y;
this(this) { writeln("Postblit (", x, ",", y, ")"); }
}
void main(string[] args) {
writeln("Building a");
Coord a = {1, 3};
writeln("Building b");
Coord b = Coord(4, 2);
}
/*
(fcn) sym._Dmain 78
; var int local_14h @ ebp-0x14
; var int local_10h @ ebp-0x10
; var int local_ch @ ebp-0xc
; var int local_8h @ ebp-0x8
; var int local_4h @ ebp-0x4
; DATA XREF from 0x08078f13 (sym.main)
0x080786e0 push ebp
0x080786e1 mov ebp, esp
0x080786e3 sub esp, 0x14
0x080786e6 mov dword [ebp - local_14h], ebx
0x080786e9 mov ecx, str.Building_a
0x080786ee mov eax, 0xa
0x080786f3 push ecx
0x080786f4 push eax
0x080786f5 call
sym._D3std5stdio16__T7writelnTAyaZ7writelnFNfAyaZv
; Construction of 'a'
0x080786fa mov dword [ebp - local_10h], 1
0x08078701 mov dword [ebp - local_ch], 3
0x08078708 mov edx, str.Building_b
0x0807870d mov ebx, 0xa
0x08078712 push edx
0x08078713 push ebx
0x08078714 call
sym._D3std5stdio16__T7writelnTAyaZ7writelnFNfAyaZv
; Construction of 'b'
0x08078719 mov dword [ebp - local_8h], 4
0x08078720 mov dword [ebp - local_4h], 2
0x08078727 xor eax, eax
0x08078729 mov ebx, dword [ebp - local_14h]
0x0807872c leave
0x0807872d ret
*/
No postblit.