Binding temporary to a lvalue reference

为君一笑 提交于 2019-11-26 23:23:31

问题


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


回答1:


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.




回答2:


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.




回答3:


This is a Microsoft Extension, to mimic the behavoir of many other microsoft compilers. If you enable W4 warnings, you will see the warning.




回答4:


It doesn't compile, with g++ 4 at least:

foo.cpp: In function ‘int main()’:
foo.cpp:16: error: invalid initialization of non-const reference of type ‘std::string&’ from a temporary of type ‘std::string’
foo.cpp:10: error: in passing argument 1 of ‘void mutate(std::string&)’

(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.




回答5:


I guess it depends on the compiler. g++ 4.1.2 gives me this.

In function 'int main()':
Line 15: error: invalid initialization of non-const reference of type 'std::string&' from a temporary of type 'std::string'
compilation terminated due to -Wfatal-errors.

Maybe because you're not doing anything the call is optimized away.



来源:https://stackoverflow.com/questions/1345382/binding-temporary-to-a-lvalue-reference

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!