How is operator+ called with rvalue reference?

N

Nephi Immortal

I read rvalue reference article. Here is the website:
http://blogs.msdn.com/b/vcblog/arch...-references-c-0x-features-in-vc10-part-2.aspx.
I wrote my code below. I can only see that rvalue reference is used
in the first parameter of the operator+ function.

int main()
{
string s1( "01" );
string s2( "23" );

string s3 = s1 + s2 + "AB";

return 0;
}

After s3 executed, first function is called:

basic_string<_Elem, _Traits, _Alloc> operator+(
const basic_string<_Elem, _Traits, _Alloc>& _Left,
const basic_string<_Elem, _Traits, _Alloc>& _Right)

Then, it moves in the right direction and second function is called:

basic_string<_Elem, _Traits, _Alloc> operator+(
basic_string<_Elem, _Traits, _Alloc>&& _Left,
const _Elem *_Right)

Until move assignment operator is reached.

Can you please be kind to demonstrate your code? How can two
functions be called like below?

basic_string<_Elem, _Traits, _Alloc> operator+(
const _Elem *_Left,
basic_string<_Elem, _Traits, _Alloc>&& _Right)

and

basic_string<_Elem, _Traits, _Alloc> operator+(
basic_string<_Elem, _Traits, _Alloc>&& _Left,
basic_string<_Elem, _Traits, _Alloc>&& _Right)
 
S

SG

I read rvalue reference article.  Here is the website:
http://blogs.msdn.com/b/vcblog/archive/2009/02/03/rvalue-references-c....

Unfortunately, this article is not up-to-date with respect to the
current rvalue reference rules. But the same author also made a nice
video tutorial on this topic not too long ago:

http://channel9.msdn.com/Shows/Goin...-Lavavej-Standard-Template-Library-STL-9-of-n

I can also recomment Scott Meyers' recent talk on this topic which is
publicly available on the net.
I wrote my code below.  I can only see that rvalue reference is used
in the first parameter of the operator+ function.

int main()
{
    string s1( "01" );
    string s2( "23" );
    string s3 = s1 + s2 + "AB";
    return 0;
}

After s3 executed, first function is called:

string operator+(
        const string& _Left,
        const string& _Right)

Then, it moves in the right direction and second function is called:

string operator+(
        string&& _Left,
        const char *_Right)

Until move assignment operator is reached.

That seems about right.
Can you please be kind to demonstrate your code?  
How can two functions be called like below?

string operator+(
        const char *_Left,
        string&& _Right)

and

string operator+(
        string&& _Left,
        string&& _Right)

OK, here it is:

----------8<----------

string world();

int main() {
"Hello" + world(); // invokes operator+(const char*,string&&)
world() + world(); // invokes operator+(string&&,string&&)
return 0;
}

----------8<----------

Cheers!
SG
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,744
Messages
2,569,484
Members
44,903
Latest member
orderPeak8CBDGummies

Latest Threads

Top