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