ref?

Denis Koroskin 2korden at gmail.com
Sun Feb 15 14:40:30 PST 2009


On Sun, 15 Feb 2009 18:50:13 +0300, Andrei Alexandrescu <SeeWebsiteForEmail at erdani.org> wrote:

> Walter and I have been discussing what the regime of statically-sized  
> arrays should be. In short, the behavior that's most consistent with  
> everything else is to treat them as values.
>
> This also brings the problems of e.g. containers - should they have  
> consistent value semantics (like in STL) or consistent reference  
> semantics (like in Java)? Or both, subject to a policy parameter?
>
> At any rate, it looks like the days of cheap by-value copying are over.  
> Even today, large structs become onerous to pass by value. If copy  
> constructors start being used, we can't simply assume that copying  
> things around is not a problem.
>
> Today we use:
>
> void fun(T)(T value) { ... }
>
> or
>
> void fun(T)(ref T value) { ... }
>
> to make a choice in parameter passing. But neither is perfect. The  
> former copies too much, and the latter does not accept rvalues. C++ has  
> found a solution to this problem in the guise of references to const  
> objects. Those can accept lvalues and rvalues alike. It looked like a  
> good solution at the time, but it's caused huge issues in other areas of  
> the language, which ultimately led to a complicated feature called  
> rvalue references. So I'd like to veer a different way.
>
> I was thinking of something like:
>
> void fun(T)(ref? T value) { ... }
>
> This really generates two overloads:
>
> void fun(T)(ref T value) { ... }
> void fun(T)(T value) { return (cast(void (ref T)) fun)(value); }
>
> meaning that there are two fun instantiations, one actually doing the  
> work, and the other just forwarding rvalues to it.
>
> There's one little extra thing that the feature does. A function may  
> want to return its incoming argument, in which case it might say:
>
> ref? T fun(T)(ref? T value) { ... return value; }
>
> in which case the generated code is:
>
> ref T fun(T)(ref T value) { ... }
> T fun(T)(T value) { return (cast(void (ref T)) fun)(value); }
>
> I wanted to discuss this to gather more ideas and insights on the topic.
>
>
> Andrei

Yay,

const?(char)[] substr(const?(char)[] str, int from, int to)
{
    return str[from..to];
}

That's what I saw in your proposal :)




More information about the Digitalmars-d mailing list