无法推断模板化 ufcs 函数的类型

Unable to infer the types for templated ufcs functions

struct None{};
struct Some(T){
  T value;
}
Optional!T some(T)(T value){
  return Optional!T(Some!T(value));
}
bool isNone(T)(ref Optional!T optional){
  return optional.peek!None != null;
}
bool isSome(T)(ref Optional!T optional){
  return optional.peek!(Some!T) != null;
}
Optional!T none(T)(){
  return Optional!T(None());
}
alias Optional(T) = std.variant.Algebraic!(Some!(T),None);
void main()
{
  Optional!int si = none!int();
  writeln(isNone!int(si));
  writeln(isSome(si)); //cannot deduce function from argument types
}

为什么我必须使用显式类型调用 isSomeisNone? D 不应该能够推断出类型吗?

我猜这是因为 Optional(T) 只是一个类型别名?

我认为这是一个 DMD 错误,与此 NG thread 中指出的相同。

模板别名化后,模板参数推导失败