d放松不变3
:但是仅使rc
计数结构可变
的问题是什么?
这样,不会遇到绕过不变/常
系统,只是增加计数器或元数据
问题.
注意:rc
构的有效负载
,如果需要,可是常
或不变
的.
理论上,这是我认为
的正确方法.但是,它确实妨碍了可用性
.如,你不能再写:
auto myFunc(in RC!Data data) { ... }
因为RC!...
必须始终保持可变
.必须这样了:
auto myFunc(RC!(const(Data)) data) { ... }
一些不错
的隐式转换
也不再工作.
如,RC!Data
不会隐式转换为RC!(const(Data))
,
而使用GC
处理数据时,可隐式转换Data*
为const(Data)*
.这不对称性
使得元编程
更难与RC
一起工作.
一旦有嵌套结构,事情更糟,如:
struct SubData {...}
struct S {
RC!SubData data;
}
现在不能传递S
给需要常
的东西,因为常
的传递性
会强制RC!SubData
变为常(RC!SubData)
,这会破坏引用计数
机制.
只要数据结构
的子部分中有RC!xxx
,它就会用可变
来"反向感染
"整个数据结构,不能再在结构
的包含部分使用常
,因为它会破坏RC
.
除非有像__mutable
这样的特例
,否则一旦子部分
涉及RC
,就必须从数据结构
中完全抛弃常/不变
了.
如果简单定义@system
变量为"不能从@safe
代码中使用",则这不明显.如果定义为"可覆盖
类型系统",则是显而易见
的.
唯一问题
是这是否是好
语言设计?这当然很容易解释:
问:“什么是@system
变量?”
A:“只要来自@system
代码,可用它做事
的变量.”
问:“目的?”
A:“做普通变量
无法做到,及编译器无法自行判断
时标记普通变量为危险
.”
如果愿意放弃pure
,可让RC
与常
和不变
一起工作:
个人而言,我宁愿放弃pure
(其中已有漏洞),也不愿给不变
(目前无漏洞)添加
漏洞.
RC!(常 T)
更好.
不能用别名 本
吗?
即在Rc
结构中这样:
alias this = asQualified;
其中asQualified
返回具有合适修饰符
版本.
诚然,按字段用RC
并不容易,但是否可禁止不变
版本,来为初始实现
忽略该问题?
始终可扩展RC
结构来支持自身的不变/常
限定符.
也许最好先实现受限版本
?即只有可变
的rcs
?
当然是的.阻碍了表现力
,增加了附带复杂性
.双输.
语言不应加额外
语句就描述
了我的意思.
这是我用来确定
需要做什么
才能使常RC
类型无用(并希望是安全
的)的测试代码.
void main() {
auto r1 = /+const+/ Reference(2);
const r2 = r1;
const r3 = Reference(2);
const(Reference) r4 = Reference(2);
//auto r5 = cast(const)r1;
auto r6 = cast(void*)&r1;
auto r7 = cast(const)&r1;
}
struct Reference {
int x;
@safe:
this(int value) {
this.x = value;
}
this(ref Reference other) {
this.x = other.x;
}
~this() {
this.x = 0;
writeln("析构器");
}
void opAssign(ref Reference other) {
__ctor(other);
}
void opAssign(Reference other) {
__ctor(other);
}
// bool isNull() { ... }
@disable this(int value) const;
//@disable this(ref Reference other) const;
@disable this(ref const Reference other) const;
@disable this(this);
//@disable ~this() const;
@disable void opAssign(ref Reference other) const;
@disable void opAssign(Reference other) const;
@disable auto opCast(T)();
}
:当然是的.阻碍了表现力
,增加了附带复杂性
.双输.
错误.允许做你想做
而不强迫
做不想做的
时,简单
就是好的.如果你说的是真的,则D应该用曾经建议
的每一个内置属性
和类型限定符
,因为缺少它们会"妨碍表达
".
DIP1035
的用例,一般是使用__metadata|__mutable
的严格子集.同意只能从@system
代码中访问__metadata
变量.因此,实现__metadata
,基本上可免费得到DIP1035
.我建议,简单用DIP1035
的@system
来包含这两个想法
.
DIP1035
目的是强制
按不安全
对待按不安全的方式
使用的变量
.如果要确定合并@system
和__metadata
是否是好主意,首先要提出用例来证明
可能的目的冲突
,如下所示.
需要展示
因为不安全方式的@system
变量,可能导致按不同方式危险地使用
它,现在,它是不变
的了.
对我来说,这很艰巨.如果不能提供示例,凭什么说这两个功能
不能结合?
我的主要观点是,可变性
正是标记变量
为@system
的原因.对初化为不安全
值并因此推导
为@system
的全局数据,我甚至不知道他们的用途
.对我来说它们是错误.
我实现了shared_ptr/rc_ptr
.这里
SharedPtr!(const int) sp = SharedPtr!int.make(42);
const SharedPtr!(const int) csp1 = sp; //OK
const SharedPtr!(int) csp2 = sp; //OK
sp = csp1; //ERROR
sp = csp2; //ERROR
//RcPtr is same.
D中引用计数
指针有问题:
D中的RAII
很糟糕:未实现移动ctor
,重载复制ctor
有时会导致dmd
崩溃,GC
切片不能调用复制ctor
,dtor
与栈元组/值序列
和opCast,emplace
的交互不良…
简单的ref
计数指针也有该问题:
Rc!(const int) rc1 = Rc!(int).make(42);
Rc!(const int) rc2 = Rc!(immutable int).make(42);
有Rc!(const int)
的原子计数吗?
你的提议并不简单.
你的提议迫使我做不想做
,而禁止
做我想做的
.我不想要它.
你的提议
不符合自己的标准
.
很明显,你认为简单性和表达性
都是语言中属性
数量的单调
函数.如果是这样,应将@safe
和pure
及@nogc
和nothrow
混为一谈,那样"更简单
".这是荒谬的!
__metadata
是更多好处加更多限制
.几乎没有D程序员
必须直接使用它.
不,我建议你阅读DIP1035
并找到__metadata
未涵盖的方面.
不能简单地把@system
和__metadata
混为一谈
所以所有潜在危险
的东西都一样
吗?也可在此时完全关闭"@system"
代码中的检查类型和边界
.多么荒谬推理.
即使可变性
是问题,也不应简单地隐式/偶然
绕过"常"
,即使在"@system"
代码中也是如此.
该提议问题:
@system
不表明"这是可变
的",这是非常不直观
的语言规则.你可字面上声明@系统 不变
,就会被忽略.
@system
变量在低级代码
中相当常见
.显式__mutable
更专业,并在应用
上受到限制
.扩展@system
来包含该更狭窄
用例无意义,因为大多数@system
用户不想要它.
可从初化
程序中推导
出@system
.如果const/immutable
只是从变量
声明中脱离
出来,则非常令人困惑
,尤其是如果它不经常时.
通过把__metadata
和@system
混为一谈,编译器似乎在使用隐含
,不安全
的和不必要
的类型双关语.初化时,不变
从现有值
中去掉了传递性
.可能还有无法编译@system t=foo()
,这种设计,因为你不能把foo()
的不变
结果赋值
给可变的t
,但这同样无意义.
模板
代码可能有基于参数可变性
而不同的逻辑(如,从A到B实例,复制
所有可变
字段值).
对不同模板参数
,模板内的变量
并不总是相同
方式推导为"@system"
.现在突然,有时会完全不安全
,完全隐含类型双关语
,甚至无法从外部
分辨出来.如果"幸运
",代码
可能无法编译
,因为你无法将T v=init();
赋值回T w
等内容.
内存安全
可能取决于保持值的@system
字段,因此拥有不变
的@system
字段很有用.
可有相同
,其中一些是静态
的类型
的可变和不可变
实例.如果类型有@system
字段,该提案阻止
不变实例存储在只读
数据段中.
@system
值与基于不变
的其他优化
同样工作.(除非@system
与__metadata
任意混为一谈.)不应在快速
代码和@safe
检查的健壮性
间做出选择.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现