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
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.