有人能解释为什么这段代码不会产生编译错误吗?
class Foo
{
public:
int _x;
};
Foo getFoo()
{
Foo myfoo;
myfoo._x = 10;
return myfoo;
}
int _tmain()
{
// shouldn't this line of code be a compiler error?
Foo& badfoo = getFoo();
return 0;
}
答案 0 :(得分:4)
这应该是一个编译错误,尽管如果它不是
const Foo& badfoo = getFoo();
由于有一个特殊规则可以延长绑定到常量引用的临时值的生命周期,但仅限于常量引用,而不是任何引用。
您发布的代码给了我预期的编译错误
错误:初始化无效 'Foo&'类型的非常量引用 来自临时的'Foo'
在G ++ 4.3.2上。您使用的是哪种编译器?
答案 1 :(得分:4)
您可能正在使用VC ++,它允许将其作为扩展名。
main.cpp:18: warning C4239: nonstandard extension used :
'initializing' : conversion from 'Foo' to 'Foo &'
答案 2 :(得分:0)
没有。 getFoo()
返回一个值,这意味着将分配一个临时副本,引用将引用该副本。
答案 3 :(得分:0)
您可以绑定对临时对象的引用,它们具有引用本身的生命周期。
另一方面,如果getFoo返回Foo&,则会遇到一些问题,因为当getFoo函数结束时,对象的生命周期将结束。由于您没有返回对内部数据的引用,而是返回该数据的副本,因此您没问题。
答案 4 :(得分:-1)
getFoo方法也可以是这样的:
Foo getFoo()
{
Foo* myfoo = new Foo();
myfoo->_x = 10;
return *myfoo;
}
这没关系......编译器无法知道所有事情:)