DIP1000: Scoped Pointers (Discussion)
Walter Bright via Digitalmars-d
digitalmars-d at puremagic.com
Sun Aug 14 13:02:35 PDT 2016
On 8/14/2016 7:37 AM, Dicebot wrote:
> struct Container
> {
> int data;
>
> static struct Range
> {
> int* pdata;
> // range methods skipped for clarity ..
> }
>
> Range asRange ( )
> {
> return Range(&this.data);
> }
> }
>
> void main ( )
> {
> Container container;
>
> import std.stdio;
> writeln(container.asRange()); // case 1, OK
>
> scope r = container.asRange(); // case 2, OK
> auto r = container.asRange(); // case 3, not OK
> }
A great example. Let's analyze by peeling back the syntactic sugar:
----
'container' is a stack variable
'container.int' is a stack variable
'asRange()' returns an instance of 'Range' which is a stack variable, call it
'range'
'range.pdata' is a stack variable
Range range.pdata = &container.data; // range is inferred as 'scope' because
// container.data is a stack variable
auto r = range; // r is inferred as 'scope' because 'range' is 'scope'
----
It's a bit advanced, but it falls entirely in the DIP rules and is workable with
some implementation effort (not sure how much).
The idea is, if something is ultimately a stack variable, the scope rules apply.
More information about the Digitalmars-d
mailing list