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