ref struct member function

ag0aep6g anonymous at example.com
Fri May 14 13:49:19 UTC 2021


On 14.05.21 12:00, PinDPlugga wrote:
> Hi thank you both for your answers. I had understood from an earlier 
> chapter how this could introduce a bug, but I was confused because the 
> warning suggests attaching ```return``` to the parameter, which is empty 
> in the declaration.

`this` is considered a hidden parameter. Every non-static method has it.

> So my next question would be how come ref based operator overloads are 
> not labelled as return and do not show this warning?
> 
> ``` D
> struct Fraction {
>      auto n = 0L;
>      auto d = 1L;
> 
>      ref Fraction opUnary(string op)()
>      if (op == "++") {
>          n += d;
>          return this;
>      }
> }
> 
> ref Fraction foo() {
>      auto f = Fraction(1, 3);
> 
>      // Same bug as with reduce
>      return ++f;
> }
> ```

Note that opUnary is not an ordinary method. It's a template. That means 
attributes are inferred [1], including the `return` attribute. I.e., the 
compiler adds `return` to the signature for you, just like Steven 
suggested you do manually.

Try omitting the return type of `reduce` in your original code:

      ref reduce() { ... }

That also enables attribute inference, and your code will compile.


[1] https://dlang.org/spec/function.html#function-attribute-inference


More information about the Digitalmars-d-learn mailing list