d允许隐式切片静态数组
struct S {
int[] data;
this(int[] _data) { data = _data; }
}
S makeS() {
int[5] data = [ 1, 2, 3, 4, 5 ];
return S(data);
}
void func(S s) {
import std.stdio;
writeln("s.data = ", s.data);
}
void main() {
S s = makeS();
func(s);
}
期望输出:
s.data = [1, 2, 3, 4, 5]
实际输出:
s.data = [-580467872, 32764, 1617267003, 21973, 5]
如果使用@safe注解函数,会得到:
test.d(9):弃用:引用赋值给调用this的非域参数的数据局部变量
编译器自动切片静态数组,是非常好的,因为键入更少.应由@safe和scope来检测逃逸过期栈帧指针.不过,在系统代码中,没问题.
我不同意,编译器隐式切片静态数组,和C++中的隐式构造有同样的问题:引起意外.
不应逃逸过期栈帧指针,至少,不应是隐式的.如果想显式地逃逸引用局部静态数组,应强制显式切片,而不是让编译器悄悄插入它.
意思是,有时,确实值得隐式切片静态数组.如,标准库可实现带动态数组函数,用户可方便地使用静态数组来调用它们.这一般不会使内存崩溃,对无经验用户可有更流畅的体验.
此外,计划默认设置DIP1000和@safe,因此,默认自动发现自动切片可能逃逸到过期栈帧指针的动态数组.
反对该行为,只会给经验不足用户带来烦恼,而没有明显好处.
浙公网安备 33010602011771号