On Thursday, December 08, 2016 22:32:47 Jerry via Digitalmars-d-learn wrote: > On Thursday, 8 December 2016 at 21:46:26 UTC, Jonathan M Davis > > wrote: > > However, at least as of C++98, non-copyable elements in a > > container were not allowed IIRC, so it would have been pretty > > rare to have a C++ iterator that returned a non-copyable value > > when you dereferenced it. > > Even if it was uncommon, i doubt anyone actually made a copy of > the dereferenced iterator.
I've seen that in C++ code all the time, especially if you're dealing with smart pointers, because otherwise you have to do stuff like (*iter)->foo() instead of just var->foo(). > There were also no restrictions in place that every algorithm > needed it to be copyable, only the ones that actually needed it. > In the case of C++, dereferencing an iterator was basically free. > As an iterator was essentially a pointer and there were no > special iterators. Except that C++ _does_ have special iterators. They're just not as common. > As an example you can write the following in C++: > > int foo0() { return 10; } > int& foo1() { static int i; return i; } > > const int& a = foo0(); // a copy is made on the stack, this > ref points to it > const int& b = foo1(); // this ref points to the global > variable in foo1() > > Yes, not allowing copyable elements for ranges is a problem. > > But allowing them would also be a big problem. > > Not if one of the biggest and most reoccurring complaints with D > was fixed. With the upcoming improvements to @safe and return ref, it _might_ happen that there will be a way for a function to accept rvalues by ref. Andrei has indicated that a really good proposal might be accepted. But that's a separate issue from having ref on local variables, which is what would be required for what you're suggesting, and both Walter and Andrei have been adamant that that is not worth it - even without getting rvalue references into the mix. I don't know that it would be impossible to convince them otherwise, but I would be _very_ surprised if anyone managed to talk them into it. And for the most part, with ranges, this is pretty much a non-issue. It does become an issue when you start worrying about ranges with a non-copyable front, but this is literally only the second or third thread that I have ever seen where anyone complained about it. Much as it is annoying when someone runs int ito, it's not a big complaint that folks have. And given how much of a pain it would be to deal with in general, I seriously question that it's worth it - especially when simply using pointers fixes the problem. - Jonathan M Davis