On Wednesday, 11 July 2018 at 12:55:35 UTC, Timoses wrote:
On Tuesday, 10 July 2018 at 18:01:59 UTC, Steven Schveighoffer wrote:
You are overthinking :) inout typically is much easier than you expect, until you need to create temporary structs or types with inout members, then it becomes problematic.

https://run.dlang.io/is/kosYuC

I had to put in a static if, because your function doesn't work once you get down to the array type. See the // fixme comment.

Ok, well that helped a tiny bit for the example.

I'm trying to reproduce the errors from my project. It's starting to get out of control : D. inout is on a rampage!

https://run.dlang.io/is/5TN7XX

I guess it's the same as for immutable initialization of arrays. I can't seem to find a proper response to this one..

[...]
        class TestA(T : T[])
        {
                Test!T[] arr;

// ERROR: Can't initialize inout variable in a for loop...
                this(inout(T[]) arr) inout
                {
                        // 1: Nope
                        foreach (mem; arr)
                            this.arr ~= test(mem);

                        // 2: Nope
                        //Test!T[] a;
                        //foreach (mem; arr)
                        //   a ~= test(mem);

                        import std.algorithm : map;
                        // 3: Nope
                        // this.arr = arr.map!((e) => test(e)).array;
                }
        }

[...]


I guess the problem here is focused around the problem that the incoming type in the constructor is inout and that the constructed object itself is inout.

I can't seem to find another way, I'm just blatantly casting now...

class TestA(T : T[])
{
    Test!T[] arr;
    this(inout(T[]) arr) inout
    {
        import std.algorithm : map;
        import std.range: array;
        // should be okay to cast to const, won't change anything
        auto ts = cast(const T[])arr;
// should be okay as well, as `test(t)` creates a new object this.arr = cast(inout(Test!T[]))(ts.map!(t => test(t)).array);
    }
}

I also found `assumeUnique` in std.exception, or std.experimental.allocator.makeArray. I'm not to sure how they might be able to circumvent the casting though, since I need an inout array of the objects...

Am I missing something or is `inout` simply not that well "implemented" yet?


Reply via email to