D中的函数和委托文字

Sta*_*tas 7 type-inference d

阅读关于函数和委托文字的TDPL(5.6.1)

auto f = (int i) {}; 
assert(is(f == function));
Run Code Online (Sandbox Code Playgroud)

我有一个断言失败.这个断言是否正确?

我尝试了以下方法:

int z = 5;
auto f = (int i) { return i < 5; };
auto d = (int i) { return i < z; };
assert(is(typeof(f) == typeof(d)));
Run Code Online (Sandbox Code Playgroud)

断言在那里是有效的.实际上f是委托,即使它不需要帧指针来访问局部变量也不是函数.这是一个错误吗?

另外,我不明白assert(is(f == function));应该怎么做.

我试过assert(is(f == delegate));但也失败了.怎么了?

我使用DMD32 D Compiler v2.053

UPDATE

auto f = (int i) {};
assert(is(typeof(f) == delegate))
Run Code Online (Sandbox Code Playgroud)

工作正确,虽然没有理由成为代表

auto f = function (int i) {};
assert(is(typeof(f) == void function(int))); // correct
assert(is(typeof(f) == function));           // failed!!!!!
Run Code Online (Sandbox Code Playgroud)

奇迹.似乎D2尚未准备好用于生产.

Jus*_*n W 5

"f"是一个变量.的就是表达进行比较的类型.这应该工作:

assert(is(typeof(f) == delegate));
Run Code Online (Sandbox Code Playgroud)

如果要创建函数而不是委托,可以使用函数文字语法:

auto f = function (int i) { ... };
assert(is(typeof(f) == function));    // should be true
Run Code Online (Sandbox Code Playgroud)

如果不使用函数文字语法,则假定文字是委托(表达式,在"函数文字"下查看.这是有道理的,因为D不应该根据文字的主体是否需要堆栈框架来更改类型(编辑:TDPL确实指定编译器会推断一个函数而不是一个委托,如果可以的话,无论"function"关键字如何.这对我来说似乎是一个糟糕的主意,所以这可能是某种东西已被删除.

至于为什么(f ==函数)不起作用,这看起来像一个回归.