d修复opApply重载

原文

修复opApply重载

opApply特化,旧实现用Type.covariant来抑制过度歧义错误.延迟检查歧义至循环体上推断属性后,允许如对@safe/@system闭包用@safe/@system不同属性的opApply重载.
示例:

struct Collection {
    /* A. */ int opApply(int delegate(int) @safe dg) @safe;
    /* B. */ int opApply(int delegate(int) @system dg) @system;
}
void main() @safe {
    Collection col;
    foreach (entry; col) {} // 解析为A.
}

前面代码检查之前选择的opApply和当前重载是否在方向上是协变的(即A.covariant(B)B.协变(A)).
本实现建立在即示例中的opApply函数是协变的有缺陷的假设上,但它们不是(由于Type.covariant中的错误而错误报告).
考虑opApply重载类型

A: int function(int delegate(int) @safe dg) @safe;
B: int function(int delegate(int) @system dg) @system;

A/B都不是另一个合适的替代品:

由于opApply的属性,A<=B是无效的.A@system函数可能不会在@safe函数中出现.
由于参数类型(dg属性),A=>B无效.
可能不会按接受@system回调函数对待期待@safe闭包的函数.否则可默默地执行@safe函数中禁止的@system回调.
注意,示例中回调用函数而不是闭包时,Type.covariant已拒绝协变.

新实现不依赖于Type.covariant的易错行为.它检查两个不同方面来延迟解析opApply:
opApply函数上的不同属性
接收foreach主体回调的协变
因为matchParamsToOpApply拒绝不匹配参数类型,(2)应处理foreach主体上不同的限定符.
此补丁使我们可不破坏现有代码修复上述错误.它还允许尽管有效但也没啥用的在测试用例中加代码.

posted @   zjh6  阅读(8)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示