On Sat, 06 Aug 2016 07:56:29 +0200, ag0aep6g wrote: > 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.
Which is a bit awkward because in no other context is it possible to mention a raw method. You invoke it or you get a delegate to it. And if you try to get a delegate explicitly to avoid this, you run into https://issues.dlang.org/show_bug.cgi?id=1983 . It's also a bit awkward for a method to be reported to exist with no way to call it. While you can do the same with private methods, you get a warning: a.d(7): Deprecation: b.B.priv is not visible from module a Which implies that this will become illegal at some point and fail to compile.