d域外调用函数

原文

struct Foo { /* ... */
    hstring[] getHeader(LowerCaseToken name) scope return
    {
        return _headers[name].values;
    }

    hstring[] getHeader(hstring name)() scope return
    {
        enum token = LowerCaseToken.makeConverted(name);
        return this.getHeader(token); // line 605
    }
}
//两种.
struct Foo { /* ... */
    hstring[] getHeader(LowerCaseToken name) scope return
    {
        return _headers[name].values;
    }

    hstring[] getHeader(hstring name)() scope return
    {
        enum token = LowerCaseToken.makeConverted(name);
        return _headers[token].values; // line 605
    }
}

为什么只编译后一例?
前者使以下警告:
(605,30):弃用:无法取得'this'域变量地址,因为'scope'只适用一级.
为什么弃用消息打印两次?

是否使用-preview=dip1000编译器标志?
我不能重现.完成的最接近等价如下:

enum LowerCaseToken { u, l, c }

struct Foo {
    @safe:
    int* dummy;
    string[int][LowerCaseToken] _headers;

    this(return ref int i)
    {
        dummy = &i;
    }

    string[] getHeader(LowerCaseToken name) scope return
    {
        return _headers[name].values;
    }

    string[] getHeader(string name)() scope return
    {
        enum token = LowerCaseToken.l;
        // 错误. 删除来编译
        auto x = &this;
        return this.getHeader(token);
    }
}

@safe void main()
{
    int x;
    auto foo = Foo(x);
    foo.getHeader!"h1"();
}

-preview=dip1000,此操作失败,但显示与你的略有不同的消息,“无法在getHeader这个@安全函数中取本(this)域参地址”.失败是正确的,因为不能有域变量的指针(或数组或类).D没有保护挂名指向的intx存储类,因为域(Foo*)表明保护Foo的地址,而不是挂名_headers指针(地址).
但是,仅当创建指针,而不是用指针,再加上错误有点不同,所以搞不清.
(为什么打印两次弃用消息?)
该函数是模板.可能被实例化了两次.或,在项目中两次实例化了包含该函数的mixin模板.

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