On Saturday, 29 June 2013 at 12:58:51 UTC, Johannes Pfau wrote:
Am Sat, 29 Jun 2013 10:54:32 +0200
schrieb "Maxim Fomin" <ma...@maxim-fomin.ru>:
On Saturday, 29 June 2013 at 08:01:17 UTC, Johannes Pfau wrote:
> Am Fri, 28 Jun 2013 22:16:33 +0200
> schrieb Andrej Mitrovic <andrej.mitrov...@gmail.com>:
>
>> On 6/28/13, Johannes Pfau <nos...@example.com> wrote:
>> > A naive question: Why isn't struct S {} enough? This
>> > should be a
>> > struct with size 0 so why do we need to disable the
>> > constructor and
>> > postblit explicitly?
>>
>> Because the user should never be able to use such a struct
>> by value,
>> in other words a user might mistakenly write code such as:
>>
>> S s2 = *s; // copies 1 byte
>
> But why is that legal / does that copy _one_ byte? It seems
> like that's
> totally arbitrary. Shouldn't doing anything value-related on
> an empty struct be invalid anyway?
It copies one byte because empty structs have one byte -
according to D implementation. The value can be adjusted using
align() atrribute.
I see. I didn't know that we have this in the spec, but I guess
there's
some good reason for this behavior if it was explicitly
specified /
implemented.
For the same reasons as in C/C++, "[they] require empty classes
to have non-zero size to ensure object identity". For example,
calculating the size of an array using:
"size_t size = sizeof(arr) / sizeof(arr[0])"
Requires the object's size to be non null.
Iterating with:
s* it = arr;
s* it_end = arr + size;
for ( ; it != it_end ; ++it )
{}
Requires the objects to take up space.