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.

Reply via email to