我正在修复某些代码中的另一个错误并遇到了一些我认为是错误的代码;但是,此代码在gcc 4.4,4.5和4.6下编译,并且似乎充当“预期”。任何人都可以告诉我这是否是有效的c ++?
struct foo {
int bar;
};
foo myfunction(foo const &orig) {
foo fooOnStack = orig;
fooOnStack.bar *= 100;
return fooOnStack;
}
void myOtherFunction(foo const &orig) {
foo const &retFoo = myfunction();
// perhaps do some tests on retFoo.bar ...
}
如果这是有效的c ++,有没有人知道这是合法的理由?
答案 0 :(得分:30)
是的,这是合法的C ++。将临时引用形成为临时将临时的生命周期延长到引用的生命周期。
答案 1 :(得分:-1)
我认为你还需要小心。我有一个案例,其中g ++ - 4.9与C ++ 11和复杂的本征类型不尊重这一点(它删除返回的临时数据,即使它的生命周期应该被扩展)。因此,即使它可能是合法的,它应该被标记为狡猾,除非有一个非常好的理由。
另外,给定C ++ 11必须在调用站点分配临时值,如果按值返回,则其有用性可能比使用最新标准时的有用性要小。