D safety! New Feature?

ag0aep6g via Digitalmars-d digitalmars-d at puremagic.com
Fri Aug 5 22:56:29 PDT 2016


On 08/06/2016 03:38 AM, Chris Wright wrote:
> Some reflection stuff is a bit inconvenient:
>
> class A {
>   int foo() { return 1; }
> }
>
> void main() {
>   auto a = new immutable(A);
>   // This passes:
>   static assert(is(typeof(a.foo)));
>   // This doesn't:
>   static assert(__traits(compiles, () { a.foo; }));
> }
>
> __traits(compiles) is mostly an evil hack, but things like this require
> its use.

The two are not equivalent, though. The first one checks the type of the 
method.

__traits(compiles, ...) also passes when used that way:

     static assert(__traits(compiles, a.foo)); /* passes */

Add parentheses to the typeof one and it fails as expected:

     static assert(is(typeof(a.foo()))); /* fails */

Can also do the function literal thing you did in the __traits one:

     static assert(is(typeof(() { a.foo; }))); /* fails */

If the method wasn't there at all, they would all fail, of course. So 
the programmer couldn't mess this up as easily. I don't think this 
outweighs the inconvenience of bending over backwards to avoid 
immutable, though.


More information about the Digitalmars-d mailing list