On Sunday, 18 November 2018 at 02:37:13 UTC, Stanislav Blinov
wrote:
On Sunday, 18 November 2018 at 00:51:51 UTC, drug wrote:
On 18.11.2018 1:26, Adam D. Ruppe wrote:
That's because the compiler passes it a hidden pointer to
refer to the context outside. The compiler could perhaps be
smarter about it, and see if those methods actually refer to
the context, but it seems to simply say if the method is
there, it might refer to it and it adds the context pointer
(note that S.sizeof increases too) and a magic constructor to
set it.
Well, if "this" means hidden pointer then it never should be
returned by AllMembers at all, isn't it?
It's only "hidden" in that there's no symbol to access it. But
you can still access it via .tupleof, and it still of course
affects the ABI (i.e. S.sizeof is always at least pointer size
when S is nested).
If you want to iterate fields, .tupleof is a better way to do
it. As for that hidden pointer, you can just test with
__traits(isNested, S) whether that's present, and just don't
look at the last field.
But in that case shouldn't you be able to tell whether it has it
or not through hasMember?