What's the correct opEquals signature for structs?

Jonathan M Davis jmdavisProg at gmx.com
Tue Mar 13 17:54:44 PDT 2012


On Wednesday, March 14, 2012 01:43:54 Andrej Mitrovic wrote:
> On 3/14/12, Jonathan M Davis <jmdavisProg at gmx.com> wrote:
> > As I understand it, auto ref is supposed to work with _any_ function. The
> > _compiler_ decides whether it's best to use a ref or a value.
> 
> I never really understood the need for 'const ref' with structures. If
> the compiler knows the size of a structure shouldn't it be able to
> automatically figure out if it's faster to pass a struct by value or
> by pointer? But maybe there's more to it than that?

In C++, the compiler _never_ decides that sort of thing. It always passes stuff 
the way that you tell it to. Before auto ref, D was exactly the same way. If 
you tell function's parameter is ref or const ref, then it takes it be 
reference, otherwise it takes it by value. That works great in C++, because 
const& in C++ will take rvalues, but D doesn't do that (if nothing else, 
because Andrei is completely against it on the grounds that it makes it so 
that a function can't determine whether it's dealing with an rvalue or an 
lvalue when given a const&; I don't understand why this is a problem - in fact 
I think that most people don't - but he's quite adamant about it, and he may 
very well be right). So, D ends up with ref and const ref, just like C++'s & 
and const& except that const& doesn't take rvalues, which is where all the 
pain starts.

Ultimately, that resulted in the suggestion of auto ref, which _does_ allow 
the compiler to decide - unlike every other parameter type. So, the reasons 
for const ref really have nothing to do with auto ref, and I'd tend to argue 
that const ref is pretty pointless at this point. If you want the struct to be 
passed by value, then don't use auto ref or ref. If you want it to be passed 
by ref, then pass by ref. And if you don't care, then use auto ref. const ref 
just isn't needed. But since it precedes auto ref, we have it. And until auto 
ref works with non-templated functions, const ref is still needed.

- Jonathan M Davis


More information about the Digitalmars-d-learn mailing list