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'确实会推导属性,因为它没有声明返回类型.

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