Binding temporary to a lvalue reference

后端 未结 5 1486
清酒与你
清酒与你 2020-12-06 12:15

I have the following code

string three()
{
    return \"three\";
}

void mutate(string& ref)
{
}

int main()
{
    mutate(three()); 
    return 0;
}


        
相关标签:
5条回答
  • 2020-12-06 12:18

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

    0 讨论(0)
  • 2020-12-06 12:24

    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.

    0 讨论(0)
  • 2020-12-06 12:26

    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.

    0 讨论(0)
  • 2020-12-06 12:37

    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.

    0 讨论(0)
  • 2020-12-06 12:38

    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.

    0 讨论(0)
提交回复
热议问题