On Sunday, 13 June 2021 at 17:18:46 UTC, ag0aep6g wrote:
On Sunday, 13 June 2021 at 16:27:18 UTC, vit wrote:
Why I can take address of Foo variable but not Bar?

```d
//-dip1000

struct Foo{
    private double d;
}

struct Bar{
    private void* ptr;
}



void main()@safe{
    ///this is OK:
    {
        scope Foo x;
        scope ptr = &x;
    }

///Error: cannot take address of `scope` local `x` in `@safe` function `main`:
    {
        scope Bar x;
        scope ptr = &x;
    }
}
```

`scope` affects indirections (i.e. pointers). `Foo` doesn't contain any indirections, so `scope` doesn't mean anything for it. The compiler just ignores it. It's like you wrote `Foo x;` without `scope`.

`Bar` does contain an indirection, so `scope` actually matters and you get the error.

Thanks.

Is possible create and use scope output range allocated on stack in @safe code?

Example:
```d
//-dip1000

    struct OutputRange{
        private bool valid = true;
        private void* ptr;
        int count = 0;

        void put(Val)(auto ref scope Val val){
            assert(this.valid == true);
                this.count += 1;
        }


        ~this()scope pure nothrow @safe @nogc{
                this.valid = false;
        }


    }

    void main()@safe pure nothrow @nogc{
        import std.algorithm : copy;
        import std.range : only;

        scope OutputRange or;

only(1, 2, 3, 4).copy(&or); ///Error: cannot take address of `scope` local `or` in `@safe` function `main`
        assert(or.count == 4);
    }

```

Reply via email to