On Friday, 19 September 2025 at 16:58:38 UTC, Ali Çehreli wrote:
>On 9/18/25 10:18 PM, Steven Schveighoffer wrote:
>On Thursday, 18 September 2025 at 18:10:13 UTC, Ali Çehreli
wrote:
// Not a delegate:
static assert(is (typeof(twice) == function));
> You are mistaking the is expression for a function test with
the
function pointer type.
I disagree because it is impossible to mistake much from the documentation of the is expression:
is(T == function)
means, is T
a type, and is it a function type. Not a function pointer type.
What is a function type? It's the internal type that the compiler has for a function, which you actually cannot express in syntax.
Note from my example how both functions that need context and functions that do not need context both satisfy this test. Because they are all functions.
>I stress strongly that there is not enough information there to take anything incorrectly. The reader has to construct a consistent mental model from that documentation. I did and my mental model is intact.
I did test with 'function' against 'delegate' and it worked as I still understand it. For the example I wrote, 'is' expression succeeds for 'function' but not for 'delegate' if the nested function makes use of local scope.
void main()
{
int x;
int iNeedContext() {
return x;
}
static int iDontNeedContext() {
return 5;
}
static assert(is(typeof(iNeedContext) == function));
static assert(is(typeof(iDontNeedContext) == function));
static assert(!is(typeof(&iNeedContext) == function));
static assert(!is(typeof(&iDontNeedContext) == function));
}
I don't know how to show it any clearer. is(T == function)
is testing whether T
is a function type, not whether it needs context. It is always false for types that are not functions (including function pointers or delegates).
-Steve