Really in need of help with std.container.array.d

anonymous via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sun Oct 19 08:21:01 PDT 2014


On Wednesday, 15 October 2014 at 21:15:14 UTC, Nordlöw wrote:
> https://github.com/nordlow/phobos/commit/9daf235d7091f76cd941e29e3c167d559bf56a94
>
> but that triggers a new interesting suite of errors
>
> Error: mutable method 
> std.container.array.Array!int.Array.__fieldPostBlit is not 
> callable using a const object
[...]
> Error: mutable method std.container.array.Array!int.Array.~this 
> is not callable using a const object
[...]
> I'm stuck. Need help.

I reduced it to this:
----
struct RefCounted
{
      this(this) /* const doesn't help */ {}
      ~this() /* const doesn't help */ {}
}
struct Array
{
      RefCounted _data;
}
void main() {const Array a; const copy = a;} /* works */
struct RangeM {Array a;} /* works */
struct RangeC {const Array a;} /* error */
----

Looks like a compiler bug to me.

And here's a workaround:
----
struct RangeC
{
      const Array[1] a_;
      @property ref const(Array) a() {return a_[0];}
}
----

Using it in std.container.array:
----
      static struct Range(A)
      {
          private A[1] _outer_;
          private @property ref const(A) _outer() const {return
_outer_[0];}
          private @property ref A _outer() {return _outer_[0];}
          /* ... */
          private this(ref A data, size_t a, size_t b)
          {
              version(none) _outer = data; /* "Error: mutable 
method
                  [...].Array.opAssign is not callable using a
const object" */
              else version(none) _outer_[0] = data; /* Errors about
postblit. */
              else _outer_ = data; /* works */
              /* ... */
          }
----

Then you also have to disable any methods/overloads that would
return mutable data when A isn't mutable, e.g.:
----
          static if (isMutable!A) @property ref T front() {/* ...
*/}
----

Related: `front` and `back` cannot be inout, because the
constness depends not on Range's constness, but on Array's.


More information about the Digitalmars-d-learn mailing list