当前位置: 首页 > article >正文

2311ddip1000不能从函数返回域引用

原文
以下程序无法用-preview=dip1000编译:

void main() @safe
{
    int[3] a = [1, 2, 3];
    int[] slice;
    //好
    slice = a[];
    scope ref getSlice() { return slice; }
    //错误:把对a局部变量的`引用`赋值给非域`getSlice()`
    getSlice() = a[];
}

getSlice应该可返回可安全地赋值给'a[]'的引用.

如常,去掉抽象,化简为仅指针时,更清楚:

  @safe void test()
  {
    int i;
    scope int* p = &i;
    scope ref get() { return p; }
    get() = &i;
  }

我不太清楚本地函数上的"域"是否应限定环境指针或返回值.一般,闭包环境DIP1000不健全的一大根源.
这也会影响非嵌套函数.如:

ref int* getRef(return ref scope int* p) @safe
{
    return p;
}
void main() @safe
{
    int n;
    scope int* p;
    getRef(p) = &n;
}

在没有像Rust这样成熟的生命期系统时,不确定接受此代码是否可行,但尽量,那肯定会很方便.

问题是它不认为"getRef(p)""p"变量.=的右侧使用按值或按引用转义的逻辑,而左侧使用只能返回一个变量的'表达式到变量',因此它放弃了潜在多变量式.如:

void main() @safe
{
    int n;
    scope int* p;
    (n ? p : p) = &n;
}

错误:把"n"局部变量的引用赋值给非域"*(n?&p:&p)"
这可通过对左边使用相同的按值转义逻辑,并对一切左边变量重复其余的checkAssignEscape逻辑来解决.
它不会有最佳时间复杂度,但复杂左边式应该不多.


http://www.kler.cn/a/133055.html

相关文章:

  • 处理namespace问题:Namespace not specified for AGP 8.0.0
  • git创建远程仓库,以gitee码云为例GitHub同理
  • Go语言中的类型
  • 如何编译 Cesium 源码
  • Qt 项目架构设计
  • SpringMVC学习笔记(一)
  • 牛客——OR36 链表的回文结构(C语言,配图,快慢指针)
  • quickapp_快应用_tabBar
  • rocketmq 安装dashboard1.0.0 mq消息控制台安装 rocketmq控制台安装 rocketmq-dashboard-1.0.0编译安装
  • mysql使用--表达式和函数
  • ClickHouse 语法优化规则
  • LabVIEW编程开发NI-USRP
  • vue-router的编程式导航有哪些方法?
  • 【科技素养】蓝桥杯STEMA 科技素养组模拟练习试卷B
  • 机器视觉系统选型-定光照强度
  • 虹科示波器 | 汽车免拆检修 | 2021款广汽丰田威兰达PHEV车发动机故障灯异常点亮
  • 深入了解PHP中的经典一句话木马和变量传递漏洞
  • Lstm+transformer的刀具磨损预测
  • 长虹智能电视使用123
  • Docker 可视化面板 ——Portainer
  • Spring+Mybatis整合
  • 大数据-之LibrA数据库系统告警处理(ALM-12052 TCP临时端口使用率超过阈值)
  • 解决 uniapp 开发微信小程序 不能使用本地图片作为背景图 问题
  • C语言编程陷阱(八)
  • 解决:ERROR: No matching distribution found for PIL
  • milvus数据库-查询