scoped!T()不适用于班级成员

时间:2018-04-10 16:42:45

标签: d

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

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

如果设计中不能使用作用域类成员或者作为范围模板中的erorr,那么我并不感到害羞。如果它的设计比这更像是一个非常糟糕的错误信息。

以下代码用于演示我的问题。

import std.typecons;

public class Foo
{
    int i = 0;
}

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

void main(string[] argv)
{
    new Program();
}

1 个答案:

答案 0 :(得分:3)

auto myFoo = scoped!Foo();

此行将尝试实例化Foo类并在编译期间初始化myFoo字段 。这是因为scoped!Foo()被解释为默认值,它始终在编译期间计算,因此编译器会尝试解释此表达式(CTFE)。由于scoped会执行一些低级别的工作,因此CTFE在这种情况下无法工作。

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

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

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

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

  

Scoped成员变量必须具有   输入typeof(scoped!Class(args)),并通过调用来初始化   作用域。请参阅下面的示例。

这是引用的例子:

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);
    }
}