On Wednesday, 20 August 2014 at 20:39:42 UTC, Jonathan M Davis wrote:
is(typeof(foo)) and __traits(compiles, foo) are not the same. The first tests for the existence of the symbol, whereas the second checks whether the code will actually compile.

Is that even true? I mean, are you just repeating something you've heard, or have you checked? "is(typeof(foo))" has always failed for me merelly if "foo" fails to compile. "foo" being an existing (but private) symbol is enough.

Test case:
//----
module foo;

struct S
{
    private int i;
}
//----
import foo;

void main(string[] args)
{
    S s;
    writeln(is(typeof(s.i)));
    writeln(__traits(compiles, s.i));
}
//----

This says false, false.

I've yet to find a usecase where "is(typeof(...))" and "__traits(compiles, ...)" aren't interchangeable.

I mean, I may have missed something, but it seems the whole "private" thing is just miss-information.

Reply via email to