scoped!T() 不适用于 class 成员

scoped!T() not working for class members

我正在尝试使用 scoped!T() 模板在 Program class 内部分配以节省分配。我无法使用以下异常。

Error: cannot cast &Scoped([void, void, void, void, void, void, void, void, void, void, void, void, void, void, void, void, void, void, void, void, void, void, void, void, void, void, void, void, void, void, void, void, void, void, void, void, void, void, void, void]).Scoped_store to ulong at compile time

我不确定是不是设计使然不能对 class 成员使用作用域,或者它是否是作用域模板中的错误。顺便说一句,如果它是设计使然,那么这是一个非常糟糕的错误消息。

下面的代码是为了演示我的问题。

import std.typecons;

public class Foo
{
    int i = 0;
}

public class Program
{
    auto myFoo = scoped!Foo();
}

void main(string[] argv)
{
    new Program();
}
auto myFoo = scoped!Foo();

此行将尝试实例化 Foo class 并在编译期间 初始化 myFoo 字段 。这是因为 scoped!Foo() 被解释为默认值,它总是在编译期间计算,因此编译器会尝试解释此表达式 (CTFE)。因为 scoped 做了一些 low-level 工作,CTFE 在这种情况下不起作用。

相反,您应该在 class 构造期间在运行时初始化字段:

public class Program
{
    typeof(scoped!Foo()) myFoo;

    this()
    {
        myFoo = scoped!Foo();
    }
}

scoped 文档实际上涵盖了这种情况。引用它:

Scoped member variables must have type typeof(scoped!Class(args)), and be initialized with a call to scoped. See below for an example.

这里是参考示例:

class A
{
    int x;
    this()     {x = 0;}
    this(int i){x = i;}
    ~this()    {}
}

// ...

// Use as member variable
struct B
{
    typeof(scoped!A()) a; // note the trailing parentheses

    this(int i)
    {
        // construct member
        a = scoped!A(i);
    }
}