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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现