Possible Duplicate:
What is the difference between r-value references and l-value references? (CodeGen)
I was wondering, can anyone explain what R-Value references are on a technical level? By that I mean: What happens on assembler level when R-Value references are created.
For a small test to see what happens inside I wrote the following code:
char c = 255;
char &c2 = c;
char &c3 = std::move(c);
I know it makes no sense to create a R-Value reference to 'c', but just for the sake of testing I did it anyway, to see what it does. And here's the result:
unsigned char c = 255;
mov byte ptr [c],0FFh
unsigned char &c2 = c;
lea eax,[c]
mov dword ptr [c2],eax
unsigned char &&c3 = std::move(c);
lea eax,[c]
push eax
call std::move<unsigned char &> (0ED1235h)
add esp,4
mov dword ptr [c3],eax
I am by far no asm expert but it looks to me that, in this case, 'c3' is a regular reference to 'c' in the end.
If I bind the R-Value reference directly to a temporary (char &&c3 = 255), the last bit of assembler changes as such:
unsigned char &&c3 = 255;
mov byte ptr [ebp-29h],0FFh
lea eax,[ebp-29h]
mov dword ptr [c3],eax
From the looks of this change, I assume that c3 still actually is a reference to some memory location which holds the value 255. So it's a regular reference - the value is not copied/assigned to c3. Is this true?
Can anyone say if my assumptions are correct or if I am totally off the track? Until now I always thought of R-Value references to match a functions