Hi, I just wanted to let anyone who might interested know that there's an attempt underway to add support for rvalue references to G++. I've got a preliminary patch at http://russ.hn.org/rref/ which adds partial support for them, and I'm hoping to turn it into a complete implementation over the next few weeks.
Rvalue references are described and proposed for inclusion in a future C++ standard in a paper [1] by Peter Dimov, Howard Hinnant, and Dave Abrahams. They work pretty much the same way as normal C++ references, the main difference being that they are allowed to bind to temporary objects that hold the results of rvalue expressions. Example: struct S{}; S foo(); // invalid in C++, normal non-const references can't bind to rvalues S & lvalue_ref = foo(); // rvalue references are declared with && and can bind to rvalues S && rvalue_ref = foo(); The situations that require rvalue references are complicated, and amply described in [1] and [2]. But the basic idea is that when you have a modifiable reference to an temporary, you can work with it directly instead of having to create unnecessary copies of it. Generic code can use them to work well with objects that may be expensive to copy (like strings, containers) or impossible to copy (like auto_ptrs). The changes that need to be made to the compiler to support rvalue references are straightforward and are laid out in [1] and [3]. The compiler needs to be able to understand the && syntax for rvalue reference declarations, and to follow some new rules for && types when doing things like resolving function overloads and performing template type deduction. Rvalue references are backwards compatible, and do not in affect the compilation or behavior of existing C++ code. They have already been implemented in Metrowerks Codewarrior, and according to Howard Hinnant [4], they will be included in an upcoming release of that compiler (along with standard library extensions that take advantage of them for performance and usability gains). - Russ [1] http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2002/n1377.htm [2] http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1690.html [3] http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1770.html [4] http://groups-beta.google.com/group/comp.std.c++/browse_thread/thread/64bf775bdf069dad