d奇怪的dip1000问题
原文
进一步化简:
alias VErr = char*;
ref front_r(ref VErr r) { return r; }
ref front_p(VErr* p) { return *p; }
ref front_s(VErr[] s) { return s[0]; }
VErr g;
void main() @safe
{
VErr[1] _errors;
g = _errors[0]; /* .1从静态数组: ok */
g = front_r(_errors[0]); /*.2从引用复制的引用: ok */
g = front_p(&_errors[0]);
//.3从指针的引用,失败,但应工作
g = front_s(_errors[]);
//.4从切片的引用,失败,但应工作
}
.1
,它们在同一个函数
中,所以数据流分析
可知道域
地址未赋值给_错误
元素.
.2
,引用
是头域
,不会感染符*
自身
.3
,因为&_错误[0]
是栈变量
指针,它必须是域
.指针
有传递性
域,因此符*
也感染
了
.4
,同样,_错误[]
切片包含栈变量
指针,因此必须为域,与指针一样,切片
也有传递性域
.
我想大部分
域和相关属性,的困惑
在于域
是不应带却带有传递性
.
相反,应允许直接指定多少级间接
及每个聚集
字段是否总是域
,及遵循
域的父项
(如现在),或不要域
.
当前的设计
从根本上是混乱和不一致
的,因为大多数间接寻址链
的真正根是栈指针
的一些偏移
,而如果显式确认
为栈指针
,则它必须是域
.因为域
是可传递的,表明大多数都应该是域
,这是愚蠢
的.
这确实是个很好
示例来说明域
,因为域
是不可传递
的,且不应是:
char* global;
void main() @safe
{
char* local;
scope char** p = &local;
global = *p; // ok
}
d作者回复:
1
.&_errors
是栈指针.
2
.传递栈指针
给front_p
的'p'
变量.
3
.因为'p'
未按'scope'
声明,编译器假定front_p
允许'p'
逃逸.(对普通函数,不会推导
属性.)
4
.dip1000
规则禁止
逃逸栈指针
.
编译器按期望
工作.
如此,无情地化简
该示例,帮助揭示真正
的问题.
'front_p'
确实会推导属性,因为它没有声明
返回类型.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现