Properties D中的属性和ref返回值

Properties D中的属性和ref返回值,properties,ref,d,Properties,Ref,D,在D中测试以下各项 import std.stdio; struct S { int _val; @property ref int val() { return _val; } @property void val(int v) { _val = v; writeln("Setter called!"); } } void main() { auto s = S(); s.val = 5; } 产生“setttercalled!”作为输出 编译器使

在D中测试以下各项

import std.stdio;

struct S
{
    int _val;
    @property ref int val() { return _val; }
    @property void val(int v) { _val = v; writeln("Setter called!"); }
}

void main()
{
    auto s = S();
    s.val = 5;
}
产生
“setttercalled!”
作为输出


编译器使用什么规则来确定是调用第一个实现还是第二个实现?

这里提供了两个
@property
方法,一个接受参数,另一个不接受参数。当执行
s.val=5时
,实际上您正在做的是
s.val(5)
,但由于
val
@属性
,您可以将其作为属性而不是方法调用来编写(请参阅)。从
s.val(5)
编译器可以执行标准重载解析-请参见。

True,但他的第一个@property方法返回
ref int
,因此编译器还可以执行类似
auto a=val()的操作;a=5
。实际上,它使用dmd v2.054和原始代码实现了这一点——第一个实现被调用。如果您将行与源文件中的实现进行切换,则setter称为。。。因此,目前dmd似乎只是调用源文件中的第一个实现。