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);
}
```