已解决
2311ddip1000不能从函数返回域引用
来自网友在路上 164864提问 提问时间:2023-11-20 09:54:59阅读次数: 64
最佳答案 问答题库648位专家为你答疑解惑
原文
以下程序无法用-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
逻辑来解决.
它不会有最佳
的时间复杂度
,但复杂
的左边
式应该不多.
查看全文
99%的人还看了
相似问题
- MeterSphere | 接口测试请求体中,int类型的入参实现动态化变量
- 【Vue】Node.js的安装与环境变量的配置
- C#中抽象类、抽象方法和接口暨内联临时变量的精彩表达
- ODBC配置数据源及相关问题(“找不到工程和库”“实时错误91对象变量或with块变量未设置”等)
- OpenLayers实战,WebGL图层根据Feature要素的变量动态渲染多种颜色的三角形,适用于大量三角形渲染不同颜色
- 全网最全jmeter接口测试/接口自动化测试看这篇文章就够了:跨线程组传递jmeter变量及cookie的处理
- Go——二、变量和数据类型
- 华为云cce中环境变量的使用
- Kotlin学习——hello kotlin 函数function 变量 类 + 泛型 + 继承
- ⑩⑤【DB】详解MySQL存储过程:变量、游标、存储函数、循环,判断语句、参数传递..
猜你感兴趣
版权申明
本文"2311ddip1000不能从函数返回域引用":http://eshow365.cn/6-40227-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!