On Thursday, 25 November 2021 at 18:50:28 UTC, Teodor Dutu wrote:
>On Thursday, 25 November 2021 at 16:16:11 UTC, Stanislav Blinov wrote:
>What can be done then? If I understand correctly, the union approach was arrived at due to void initialization, as in case of exception array of garbage data is getting destructed. But then, couldn't one just write a T.init into the whole array if an exception is thrown, and not rely on a union at all?..
Actually, I used void initialisation because T.init
couldn't be used when T is a nested struct, because of the context pointer, which is unavailable in the scope of _d_arrayctor
.
I know, I was the one that suggested void initialization :D
>On Thursday, 25 November 2021 at 16:16:11 UTC, Stanislav Blinov wrote:
> > foreach (ref it; result)
emplaceInitializer(it); // this is nothrow
...pff, yeah, of course, and then we run into a segfault if it's an array of nested
structs, which was the problem "solved" with void initialization in the first place.
Not fun >:-E
I think you've already touched on what I said above, here. It's just that there wouldn't be a seg fault, but a compiler error, because of the aforementioned context pointer.
I'm just not expressing myself clearly :) This won't be a compile error. The emplaceInitializer
above would plop a null context pointer into it
, which, if the destructor actually accesses context, naturally would lead to a segfault in __ArrayDtor.
This can be avoided though, if you leech the context pointer from the elements of from
when emplacing the initializer.