Reference 在D语言中无法通过引用传递

Reference 在D语言中无法通过引用传递,reference,pass-by-reference,d,Reference,Pass By Reference,D,我在testclass类中有一个构造函数 @safe public nothrow this(参考插座){ //类内modulename.classname this.socket=socket; } 然而,当我在main方法中初始化这种类型的对象时,我得到了一些编译错误 void main(){ auto-variablename=新模块名.classname( 转换(套接字)新的TcpSocket()//main.d行5 ); } 错误: main.d(5): Error: constr

我在testclass类中有一个构造函数

@safe public nothrow this(参考插座){
//类内modulename.classname
this.socket=socket;
}
然而,当我在main方法中初始化这种类型的对象时,我得到了一些编译错误

void main(){
auto-variablename=新模块名.classname(
转换(套接字)新的TcpSocket()//main.d行5
);
}
错误:

main.d(5): Error: constructor testmodule.testclass.this (ref 
Socket socket) is not callable using argument types (Socket)
main.d(5): Error: no constructor for testclass

为什么我不能通过引用传递套接字?

我通过在构造函数调用外部初始化套接字解决了这个问题。我不确定这是一个bug,还是语言故意这样

void main(){
自动插座=铸造(插座)新TcpSocket();
auto-variablename=新模块名.classname(
插座
);
}

您不需要通过ref传递类

默认情况下,类是通过引用保留的(以避免继承时的切片问题),因此在这两种情况下都只传递一个指针


代码中的问题是,
cast(Socket)new TcpSocket()
是一个不能赋值的右值,因此不能通过ref传递。接受的答案不正确,说明:


您不需要通过ref传递类
默认情况下,类通过引用保留

类是引用类型,但对类的引用是通过值作为方法参数传递的。这只有在修改引用时才起作用

例如,修改类成员时的常见情况适用于以下任一方式:

导入标准stdio;
K类{
int i;
}
void main()
{
自动k=新k();
k、 i=3;
NonRef(k);
writeln(k.i);//写5
k、 i=3;
ByRef(k);
writeln(k.i);//写5
}
无效不可撤销(K){
k、 i=5;
}
无效ByRef(参考K){
k、 i=5;
}
但是,请考虑一下:

导入标准stdio;
K类{
int i;
}
void main()
{
自动k=新k();
k、 i=3;
NonRef(k);
writeln(k.i);//写3!
k、 i=3;
ByRef(k);
writeln(k.i);//写入0!
}
无效不可撤销(K){
k=新的k();
}
无效ByRef(参考K){
k=新的k();
}

至于您的问题,在回答这个问题时,D仍然不支持ref传递的右值。我认为这与编译器不知道如何应用ref值有关。正如您在回答中所做的那样,通过创建一个临时变量可以很容易地克服这一问题。

按ref传递
socket
在这种情况下是没有意义的,因为您从未分配给它。类型
Socket
已经是一个ref(封面下的指针),因此通过ref传递它最终成为一个引用的引用(例如指向指针的指针)。D语言目前不允许D右值引用,或者至少我认为它不允许。有一些讨论,但我认为目前的主干中还没有任何内容。好吧,当你思考被接受的答案时,你会意识到它说的是“你不应该……”,你把它误解为“你不应该……”。您需要每隔多久传递一次推荐信?我-从来没有。德简,答案在术语上不够精确,所以我想纠正它。“不应该需要”的意思是“不应该需要”。如果我们想要恢复这种效果,我们实际上“确实需要”。同样的问题在C#中一次又一次地出现,因为这也是它在C#中的工作原理。因此,我认为澄清这一点很重要。