On 24 September 2014 17:50, Walter Bright via Digitalmars-d <digitalmars-d@puremagic.com> wrote: > On 9/23/2014 4:19 AM, Manu via Digitalmars-d wrote: >>> >>> BTW, ref (as you know) is part of the type in C++. However, I can vouch >>> for >>> it being a special case everywhere in C++, and is a horrifying quagmire >>> of >>> strange edge cases. That's why it's not part of the type in D. >> >> >> I've never had any problems with ref in C++. D presents the horrible >> quagmire >> of edge cases in my experience, some of which I've presented, but I've had >> many more issues in the past. Can you give me some examples of the >> problems >> in C++ you set out to avoid? > > > Q: Given a T&, and type deduction, when do you get the T and when do you get > the T& ? > > A: It's different for every situation. Nobody can remember or enumerate the > cases. Maybe Scott Meyers.
Scott Myers presented on this in extraordinary detail. By my recollection (without referring to his talk), it was different in *one* case, not every case. It's a binary situation, so it can't possibly be different in 'every case', there are only 2 cases, and one of them is the common case. I suggest if the idea were explored in D, we would see if it works where type deduction always gives what you expect (ie, gives ref(T) for ref(T)). Unlike C++, we have an extensive suite of tools like PointerTarget!T, Unqual!T, isPointer!T and friends; we can use those tools explicitly in the places where we want T from deduction yielding ref(T). I suspect we can avoid the C++ deduction hack given the presence of these tools. And if it proves that the C++ edge case is necessary (I don't think it will), then so be it. I've never had problems with it, and always found it intuitive in 20 years, whereas D's current setup is immeasurably more complex than C++'s edge case, and causes me the greatest source of pain in the language.