endless loop with ref and non-ref parameter
Maxim Fomin
maxim at maxim-fomin.ru
Thu Jan 24 13:13:44 PST 2013
On Thursday, 24 January 2013 at 20:06:34 UTC, Ali Çehreli wrote:
> On 01/24/2013 11:33 AM, Jonathan M Davis wrote:
>
> > It's intended. constness matters more than refness when
> selecting a function
> > overload. From the docs (
> http://dlang.org/function.html#<u>function</u>-
> > overloading ):
> >
> > -----
> > Functions are overloaded based on how well the arguments to a
> function
> > can match up with the parameters. The function with the best
> match is se
> > lected. The levels of matching are:
> >
> > no match
> > match with implicit conversions
> > match with conversion to const
> > exact match
> > -----
>
> That doesn't explain why the first case selects the ref
> function:
>
> void foo(A a) {
> writeln("without ref");
> foo(a); // <-- why is this foo(ref A)?
> }
>
> void foo(ref A a) {
> writeln("with ref");
> }
>
> foo(A) is the exact match there because the type of a is A.
>
> What is also considered in function selection is the
> rvalue-lvalue distinction, which shouldn't affect the outcome
> here either.
>
> Ali
From http://dlang.org/function.html
"If two or more functions have the same match level, then partial
ordering is used to try to find the best match. Partial ordering
finds the most specialized function. If neither function is more
specialized than the other, then it is an ambiguity error.
Partial ordering is determined for functions f() and g() by
taking the parameter types of f(), constructing a list of
arguments by taking the default values of those types, and
attempting to match them against g(). If it succeeds, then g() is
at least as specialized as f()."
It is possible to pass an lvalue to both ref and non-ref
parameters, however rvalue cannot be passed to ref-parameter.
Hence ref version for lvalue is more specialized and selected.
More information about the Digitalmars-d-learn
mailing list