d的2.101版上

原文

都是编译器更改.剩下的略了.

添加位域到D

1链接,2链接

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函数的inout的合约抛异常调用抛函数.因为打破了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;
}
posted @   zjh6  阅读(10)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示