C++ 引用返回值时出错

C++ 引用返回值时出错,c++,reference,return-value,C++,Reference,Return Value,此代码无法通过编译。唯一的区别是返回类型。Foo1的返回类型是用户定义的结构,Foo2的返回类型是int struct test { }; test Foo1() { return test(); } int Foo2() { return 0; } int main() { test& r1 = Foo1(); //ok int& r2 = Foo2(); //no but why

此代码无法通过编译。唯一的区别是返回类型。Foo1的返回类型是用户定义的结构,Foo2的返回类型是int

struct test
{    
};    

test Foo1()  
{  
    return test();  
}  

int Foo2()  
{  
    return 0;  
}  

int main()  
{  
    test& r1 = Foo1(); //ok  
    int& r2 = Foo2(); //no but why? Is it the C++ standard way?  

    return 0;  
}

它要么是一个编译器错误,要么是它的“语言扩展”(例如MS VC++有许多这样的“语言扩展”)。在函数调用的两种情况下,编译器都会发出错误,因为它可能不会将临时对象绑定到非常量引用。

如果您想要引用,您仍然可以使用对常量的引用,否则两行都不会编译:

struct test
{
};

test Foo1()
{
    return test();
}

int Foo2()
{
    return 0;
}

int main()
{
    const test& r1 = Foo1(); // ok now
    const int& r2 = Foo2();  //ok now

    return 0;
}

对于在g++-4.7上编译的我来说,这两行都不是okayclang++:
错误:对类型“test”的非常量左值引用无法绑定到临时类型“test”
,两行上的错误相同。你的编译器是什么?两行都错了:你不能将一个非常量左值引用绑定到一个临时的。你到底为什么希望它是一个引用?您试图做的在概念上似乎没有意义。MSVC++可以通过“test&r1=Foo1();”