string foo() { return "hello"; }
int main()
{
//below should be illegal for binding a non-const (lvalue) reference to a rvalue
string& tem = foo();
//below should be the correct one as only const reference can be bind to rvalue(most important const)
const string& constTem = foo();
}
- GCC is the good one to give a compile error: invalid initialization of non-const reference of type
std::string&from a temporary of typestd::string - VS2008 is not too bad as at least it gives a compile warning:
warning C4239: nonstandard extension used : ‘initializing’ :
conversion fromstd::stringtostd::string &A non-const
reference may only be bound to an lvalue - Here comes the problematic one – VS2010(SP1) comples fine WITHOUT any
error or warning, WHY ??!!
I know rvalue reference in VS2010 can be used to bind with rvalue but I am NOT using&&, instead in the demo code, I was just using non-const lvalue reference !
Can somone help me explain the behavior of VS2010 here? Is it a bug !?
Thanks
That is a known issue/feature of the VS compilers. They have always allowed that and there does not seem to be any push into removing that extension.