In my adventures studying the boost libraries, I've come across function signatures that have parameters which are a reference to a reference to an object.
Example:
void function(int && i);
What is the purpose/benefit of doing it this way rather than simply taking a reference to an object? I assume there is one if it's in boost.
This is not a reference to a reference; there is no such thing.
What you're seeing is a C++0x rvalue reference, denoted by double ampersands, &&
. It means that the argument i
to the function is a temporary, so the function is allowed to clobber its data without causing problems in the calling code.
Example:
void function(int &i); // A
void function(int &&i); // B
int foo();
int main() {
int x = foo();
function(x); // calls A
function(foo()); // calls B, because the return value is a temporary
}
This rarely useful with plain int
s, but very useful when defining move constructors, for example. A move constructor is like a copy constructor, except that it can safely 'steal' the internal data from the original object, because it's a temporary that will cease to exist after the move constructor returns.
That is not a reference to a reference. It is an rvalue reference, which is a new feature supported by the upcoming C++0x standard.
What you are looking at is an rvalue-reference. It is a new core language feature of C++0x. See here or less formaly here.
The original proposal can be found here
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With