pure opApply

Steven Schveighoffer via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Thu Mar 31 06:51:00 PDT 2016


On 3/31/16 6:23 AM, Q. Schroll wrote:
> Simple as that, shouldn't this work?
>
> struct X
> {
>      int opApply(int delegate(string) dg)
>      {
>          return dg("impure");
>      }
>
>      int opApply(int delegate(string) pure dg) pure
>      {
>          return dg("pure");
>      }
> }
>
> void main()
> {
>      X x;
>      string result;
>
>      x.opApply(
>          (string s)
>          {
>              result = s;
>              return 0;
>          }
>      );
>      writeln(result); // does compile and prints "pure".
>
>      x.opApply(
>          (string s)
>          {
>              result = s;
>              write("");
>              return 0;
>          }
>      );
>      writeln(result); // does compile and prints "impure".
>
>      /+ (1)
>      foreach (string s; x)
>      {
>          result = s;
>      }
>      writeln(result); // does not compile: x.opApply matches more than
> one declaration
>      +/
>      /+ (2)
>      foreach (string s; x)
>      {
>          result = s;
>          write("");
>      }
>      writeln(result); // does not compile: x.opApply matches more than
> one declaration
>      +/
> }
>
> Can someone explain me, why the compiler cannot resolve the right
> opApply? From what I know, it generates a delegate with inferred pure
> attribute and looks for the best match of opApply. Why does the manual
> rewrite work? If I've done the rewrite improperly, please tell me.

I think it's a bug. foreach and opApply are specially coded in the 
compiler I think, so there's bound to be inconsistencies between them 
and normal overload rules.

-Steve


More information about the Digitalmars-d-learn mailing list