d拒绝@信任问题

原文

void foo() @trusted
{
    static struct T
    {
        Exception ex;
        ubyte[] buf;
    }

    scope buffer = new ubyte[100];
    T t;

    t.ex = new Exception("hello");
    t.buf = buffer;
    throw t.ex;//不能抛t,
//但这是`@trusted`,`异常`不打算为`域`.
}
//因为,有`@trusted`,应该工作.
//在`@safe`中,因为由于`t.buf = buffer;`,推导`t`为域.所以`抛`会失败.

void main() @safe
{
    foo();
}
//用-dip1000编译

但,返回值可以是无的,因此添加以下访问器可以工作:

static struct T
{
   Exception ex;
   ubyte[] buf;
   Exception getEx() { return ex; }
//好了,现在不局限`域`了.
}

...

throw t.getEx;

但仍觉得拒绝@trusted代码是错误.

实际上,你可以@安全:

void foo() @safe
{
    ...其余与最上面相同,...
    auto helloEx = new Exception("hello");
    t.ex = helloEx;//
    //最上面是直接t.ex = new Exception("hello");
    t.buf = buffer;
    throw helloEx;
}
posted @ 2022-10-25 15:18  zjh6  阅读(16)  评论(0)    收藏  举报  来源