On Monday, 8 December 2014 at 19:44:48 UTC, Walter Bright wrote:
The difference between 'scope ref' and 'ref' parameters is that the former cannot be returned by reference.

The difference between 'scope ref' and 'ref' function returns is that the former cannot be saved by the caller.

You can still safely pass the address of a stack variable by 'ref' - it will not escape. Under the current proposal, as now, you cannot store a ref by ref, and cannot take the address of a ref variable.

Easier to go straight with pseudo-code:

struct ByLine
{
    scope string front();
    // ...
}

auto byLine(File file)
{
    return ByLine(file);
}

scope /* ref */ string foo(scope /* ref */ string input)
{
    return input[1..$];
}

void main()
{
    auto r = file.byLine.map!foo;
    string s = r.front; // this should not compile
    string s = r.front.dup; // this should compile

    // how foo signature should look like for this to work?
}


I mean how many C++ type system features in general are understood my more than a handful of people on the planet? For me `ref` is essentially just a different flavor of `*` - and if the latter can be part of type, I see no
reasons why former can't

I agree it's a seductively simple idea. The trouble starts happening when you start when making ref idempotent, when ref can only be at the 'head' of a data structure, when trying to do type deduction of a ref type (do you get the ref, or do you look 'through' the ref?), what happens with overloading, etc., and on and on.

But was there any reason why those traits (alien to type qualifiers) were pursued? What is the problem with `ref` simply meaning `non-null pointer` and allowing non-idempotent ref(ref(int))?

Reply via email to