Thread overview
Why does BinaryHeap sometime cause compile-error in foeach?
Sep 30, 2017
Shigeki Karita
Sep 30, 2017
user1234
Oct 01, 2017
Shigeki Karita
September 30, 2017
https://dpaste.dzfl.pl/cd605899d050

why this code cannot convert to foreach (over Structs and Classes with Ranges).

    auto h = new BinaryHeap!(int[])(new int[0]);
    typeof(h).stringof.writeln;
    static assert(isInputRange!(typeof(h)));
    h.insert(3);
    h.insert(1);
    h.insert(2);
    // Error: invalid foreach aggregate `h`
    // foreach (e; h) e.writeln;
    for (; !h.empty; h.popFront()) {
      auto e = h.front();
      e.writeln;
    }


https://dlang.org/spec/statement.html#foreach-with-ranges

September 30, 2017
On Saturday, 30 September 2017 at 09:27:23 UTC, Shigeki Karita wrote:
> https://dpaste.dzfl.pl/cd605899d050
>
> why this code cannot convert to foreach (over Structs and Classes with Ranges).
>
>     auto h = new BinaryHeap!(int[])(new int[0]);
>     typeof(h).stringof.writeln;
>     static assert(isInputRange!(typeof(h)));
>     h.insert(3);
>     h.insert(1);
>     h.insert(2);
>     // Error: invalid foreach aggregate `h`
>     // foreach (e; h) e.writeln;
>     for (; !h.empty; h.popFront()) {
>       auto e = h.front();
>       e.writeln;
>     }
>
>
> https://dlang.org/spec/statement.html#foreach-with-ranges

The reason why it doesn't work is much more simple than you think: h is not a BinaryHeap, it's a pointer to.

Try "foreach (e; *h) e.writeln;" and it works.


October 01, 2017
Oh, struct/class semantics really confuses me!