I have the following code
string three()
{
return "three";
}
void mutate(string& ref)
{
}
int main()
{
mutate(three());
return 0;
}
You can see I am passing three() to mutate method. This code compiles well. My understanding is, temporaries can't be assigned to non-const references. If yes, how this program is compiling?
Any thoughts?
Edit:
Compilers tried : VS 2008 and VS2010 Beta
I guess it depends on the compiler. g++ 4.1.2 gives me this.
Maybe because you're not doing anything the call is optimized away.
It used to compile in VC6 compiler, so I guess to maintain backward comptibility VS2008 is supporting this non-standard extension. Try with /Za (disable language extension) flag, you should get an error then.
It is VC++'s evil extension. If You oompile with /W4 then the compiler will warn you. I guess you are reading the Rvalue References: C++0x Features in VC10, Part 2. This article had also mentioned that issue.
This is a Microsoft Extension, to mimic the behavoir of many other microsoft compilers. If you enable W4 warnings, you will see the warning.
It doesn't compile, with g++ 4 at least:
(The line numbers are off by 3 or 4, because I had to add the #include and 'using' lines.)
So, your compiler appears to not be as strict as it should be.