如何在D中表达所有权语义? struct OwnedRef(T){ 导入std.typecons:代理; OwnedRefImpl!T*w; 私有this(OwnedRefImpl!T*w){ 这个.w=w; } mixin代理!w; } 结构OwnedRefImpl(T){ 导入std.typecons:代理; 静态if(is(T:Object)) 别名RefT=T; 其他的 别名RefT=T*; 私人所有!(T)*ptr; 此(拥有!(T)*T){ ptr=t; } bool过期(){ 返回ptr为空; } 自动引用获取(){ 如果(过期()){ 抛出新错误(“访问过期的OwnedRef”); } 返回ptr.get(); } 混合代理!获取; } 结构拥有(T){ 导入标准实验分配器; 导入std.typecons:代理; 静态if(is(T:Object)){ 别名RefT=T; @安全引用T get(){ 返回ptr; } } 否则{ @安全引用T get(){ 返回*ptr; } 别名RefT=T*; } 此(Args…)(自动参考Args Args){ ptr=分配器.make!T(args); wref=新拥有的refimpl!T(&this); } OwnedRef!(T)getRef() { 如果(过期()) 抛出新错误(“拥有已过期”); 返回OwnedRef!T(wref); } bool过期(){ 返回(wref为空)| |(ptr为空); } 无空(){ if(wref!为空) wref.ptr=null; 分配器处理(ptr); } ~z~这个(){ 自由(); } 无效转让(参考本文件){ 自由(); wref=o.wref; wref.ptr=&this; ptr=o.ptr; o、 wref=null; o、 ptr=null; } 此(参考此oref) { 转移(oref); } 无效opAssign(参考此o){ 转让(o); } 混合代理!获取; @禁用此(此); @禁用无效opAssign(此选项); 私人: 参考文献ptr; OwnedRefImpl!T*wref; }

如何在D中表达所有权语义? struct OwnedRef(T){ 导入std.typecons:代理; OwnedRefImpl!T*w; 私有this(OwnedRefImpl!T*w){ 这个.w=w; } mixin代理!w; } 结构OwnedRefImpl(T){ 导入std.typecons:代理; 静态if(is(T:Object)) 别名RefT=T; 其他的 别名RefT=T*; 私人所有!(T)*ptr; 此(拥有!(T)*T){ ptr=t; } bool过期(){ 返回ptr为空; } 自动引用获取(){ 如果(过期()){ 抛出新错误(“访问过期的OwnedRef”); } 返回ptr.get(); } 混合代理!获取; } 结构拥有(T){ 导入标准实验分配器; 导入std.typecons:代理; 静态if(is(T:Object)){ 别名RefT=T; @安全引用T get(){ 返回ptr; } } 否则{ @安全引用T get(){ 返回*ptr; } 别名RefT=T*; } 此(Args…)(自动参考Args Args){ ptr=分配器.make!T(args); wref=新拥有的refimpl!T(&this); } OwnedRef!(T)getRef() { 如果(过期()) 抛出新错误(“拥有已过期”); 返回OwnedRef!T(wref); } bool过期(){ 返回(wref为空)| |(ptr为空); } 无空(){ if(wref!为空) wref.ptr=null; 分配器处理(ptr); } ~z~这个(){ 自由(); } 无效转让(参考本文件){ 自由(); wref=o.wref; wref.ptr=&this; ptr=o.ptr; o、 wref=null; o、 ptr=null; } 此(参考此oref) { 转移(oref); } 无效opAssign(参考此o){ 转让(o); } 混合代理!获取; @禁用此(此); @禁用无效opAssign(此选项); 私人: 参考文献ptr; OwnedRefImpl!T*wref; },d,D,这应该像Unique一样,但仍然允许引用对象。关系是1 Owned和N OwnedRef。如果owned超出范围,则所有OwnedRef将过期 我残疾了 @禁用此(此); @禁用无效opAssign(此选项); 因为我听说,在某些情况下,即使是右值结构也可能无法移动,我不能依赖这一点。因为我需要转移指针,我想确保唯一性,我想我必须禁用它们 这是真的吗 这意味着我必须依赖于opAssign(ref this)和this(ref this)以及transfer方法 如果我需要像hashmap这样的

这应该像
Unique
一样,但仍然允许引用对象。关系是
1 Owned
N OwnedRef
。如果owned超出范围,则所有
OwnedRef
将过期

我残疾了

@禁用此(此);
@禁用无效opAssign(此选项);
因为我听说,在某些情况下,即使是右值结构也可能无法移动,我不能依赖这一点。因为我需要转移指针,我想确保唯一性,我想我必须禁用它们

这是真的吗

这意味着我必须依赖于
opAssign(ref this)
this(ref this)
以及
transfer
方法

如果我需要像hashmap这样的容器,会发生什么

拥有!int[int]映射;
我做不到

map[42]=拥有!int(42);
因为右值构造函数和右值opAssign已被删除

但我也做不到

auto o=Owned!int(42);
map[42]=o;
为什么这是不可能的

如果我尝试的话

auto oi=Owned!int(42);
地图[42]。坦斯费尔(oi);
这会引发范围冲突,我不确定原因。我假设问题是
拥有!int
尚未初始化