Inference of auto storage classes for interface function return type

Jonathan M Davis newsgroup.d at jmdavisprog.com
Wed Jul 4 15:12:15 UTC 2018


On Wednesday, July 04, 2018 14:07:35 Timoses via Digitalmars-d-learn wrote:
> How can I return inferred storage class from interface functions?
> I can't use auto as return value in interface. Neither can I use
> "inout" as I don't pass a parameter.
>
>   // Ref Type
>   interface IRef
>   {
>       Ref opIndex(size_t idx) const;
>   }
>   class CRef : IRef
>   {
>       Ref[] a;
>       this() immutable
>       { this.a = [new Ref()]; }
>       Ref opIndex(size_t idx) const
>       { return a[idx]; } // Error: cannot implicitly convert
> expression this.a[idx] of type const(Ref) to app.Ref
>   }
>   class Ref{}
>
>   void main()
>   {
>       auto a = new immutable(CRef)();
>       auto s = a[3];
>   }
>
> For value types it works, I presume since they are passed by
> value, so the instance returned is an actual copy of the stored
> value.
>
>          // Value Type
>   interface IValue
>   {
>       Value opIndex(size_t idx) const;
>   }
>   class CValue : IValue
>   {
>       this() immutable { i = [Value()]; }
>       Value[] i;
>       Value opIndex(size_t idx) const
>       { return i[idx]; }
>   }
>   struct Value{}
>
> However, for ref types this doesn't work.
>
> Do I have to define two `opIndex` in the interface? One mutable,
> one for immutable type instances?

You can make opIndex inout instead of const. That way, inout applies to the
invisible this reference, just like it would with const.

- Jonathan M Davis



More information about the Digitalmars-d-learn mailing list