2
T maybe(alias nullCheck, T)(T expr, T def)
{
    if (nullCheck(expr))
    {
        return def;
    }
    else
    {
        return expr;
    }
}

auto tokens = chomp(readln())
              .toLower()
              .split()
              .maybe!(a => a.empty)([""])

当模板参数maybe与别名一起排列时,编译器能够正确推断参数类型。但是,当模板参数切换为 T 先出现时,它无法推断它们,也不会编译。为什么是这样?

4

1 回答 1

3

这是因为模板参数毕竟是位置参数。如果nullCheck是第二个参数,则必须先指定T,然后才能指定nullCheck.

编译器只能(非正式地)尝试推断最后一个位置参数右侧的参数,就像它们是默认参数一样。

请注意,这与 C++ 中的相同,如果您考虑一下,这也是合理的。

于 2013-04-17T07:18:16.033 回答