d的2.101版上
都是编译器更改.剩下的略了.
添加位域到D
struct B
{
int x:3, y:2;
}
static assert(B.sizeof == 4);
int vaporator(B b)
{
b.x = 4;
b.y = 2;
return b.x + b.y; // 中 6
}
添加__traits(classInstanceAlignment)
补充__traits(classInstanceSize),对手动缓冲区等提供所需的对齐方式.
align(__traits(classInstanceAlignment, C))
void[__traits(classInstanceSize, C)] buffer;
放松pragma(crt_constructor)/pragma(crt_destructor)检查
用默认void ()签名时,CRT不再需要extern(C).
-O编译时加预定义D_Optimized版本
允许代码区分它是否启用优化(-O提供了标志).这与-release正交,见assert, D_NoBoundsChecks, D_Invariants.
弃用从nothrow函数合约中抛
目前,编译器接受nothrow函数的in和out的合约抛异常和调用抛函数.因为打破了nothrow保证,现在会触发弃用.
// 过时
float sqrt(float n) nothrow
in
{
if (n < 0)
throw new Exception("n必须为正");
}
do
{
// ...
}
// 修复,删除`不抛`或用`断定`.
float sqrt(float n) nothrow
in
{
assert(n >= 0);
}
do
{
// ...
}
已弃用整数version或debug条件
整数,无意义,最好使用版本标识来描述启用功能,参考
// 过时:
version = 3;
version (2) { }
debug = 4;
debug (5) { }
// 用标识,
version = HasX;
version (HasX)
void x() { /* ... */ }
else
void x() {}
打印弃用scope指针错误
scope属性已存在很久了,但是编译器只会在传递-preview=dip1000开关时验证语义,以避免破坏代码.禁止存储在域变量中的指针或引用,逃逸定义变量的域.
一般,不必显式标记变量为scope,因为垃集(GC)负责释放内存.但是,D允许创建栈基内存分配的局部变量的指针/切片,并在域结束时析构.重要的是,在@safe代码,创建这样的指针,或为禁止的,或有scope语义强制执行,但以前,编译器无法完成:
@safe:
int[] getSlice()
{
int[4] stackBuffer;
int[] slice = stackBuffer[]; // 切片指向栈上局部变量,
return slice; // 悬挂指针
}
struct S
{
int x;
int* get()
{
int* y = &this.x; // 该构实例可为栈变量
return y; // 危险!
}
}
从本版开始,在@safe中,对栈内存指针,强制scope语义,但仅作为弃用警告.最终,它们将变成错误.要立即变成错误,请使用-preview=dip1000.要禁用弃用,请使用-revert=dip1000.
原dip1000过时,最新参考:1
2,3,4,5,6
改进生成C++标头
生成C++11兼容标头时,现在按override关键字标记覆盖的虚函数.
生成C++11兼容标头时,现在按final关键字标记最终的虚函数.
添加-preview=fixImmmutableConv
如果编译器确定结果必然是唯一的,则允许用不变的间接隐式转换返回值.以前,检查会检查间接类型,而忘记考虑如int[]至void[]的转换:
int[] f(ref void[] m) pure
{
auto result = new int[5];
m = result;
return result;
}
void main()
{
void[] v;
immutable x = f(v);
// `v`现在是`x`不变变量,的可变别名
}
现在过期从函数返回丢弃的void值
应该丢弃无副作用的void类型的表达式语句,因为它无意义.编译器通常不允许这样的语句,但是,返回语句时,这个错误被忽略了.例如:
struct StackBuffer
{
auto opIndex(size_t i)
{
return arr[i];
}
private:
void[] arr;
}
尽管可编译此代码,但调用opIndex将导致错误,因为返回类型必须存储在某处(并且变量不能是void类型),否则调用无效.
从此版开始,过期从函数返回丢弃的void值.因为它肯定是死代码,会删除它.
ImportC现在可以识别typeof(…)操作符
删除了-transition=markdown和-revert=markdown开关
Markdown现在为默认设置.
new现在可分配关联数组
在插入任何键前,允许两个关联数组引用指向同一个关联数组实例.
int[string] a = new int[string];
auto b = a;
...
a["seven"] = 7;
assert(b["seven"] == 7);
在插入空关联数组键之前不需要调用new,如果实例不存在,则将分配它.
-preview=in现在可与extern(C++)一起用,但禁用对其他非D链接
-preview=in意图做为D中输入参数的首选存储类.但是,它以D为中心,因为它是scope const ref的加强版.对期望函数匹配特定的ABI的非extern(D),使用in不是好主意.
由于C++,对输入参数有个"直达"的(constT&)存储类,in也可应用于extern(C++)函数,来绑定constT&参数.这也允许对函数公开比const ref更接近的接口,因为in,就像在C++中一样,将允许绑定右值到constT&.
默认可用短语法
int add(int x, int y) pure => x + y;
// ==
int add(int x, int y) pure
{
return x + y;
}
浙公网安备 33010602011771号