我正在尝试使用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();
}
答案 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);
}
}