按赋给const引用的值返回
return by value assigned to const reference
我正在修复一些代码中的另一个bug,并且遇到了一些我认为是bug的代码;然而,这段代码可以在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++,有人知道这是合法的背后的理由吗?
是的,这是合法的c++。形成对const的引用,将临时对象的生命周期延长到引用的生命周期。
我认为你仍然需要小心。我有一个案例,c++ -4.9与c++ 11和复杂的特征类型不尊重这一点(它删除数据在返回的临时,即使它的生命周期应该延长)。因此,即使它可能是合法的,也应该被标记为危险的,除非有一个真正好的理由。
而且,c++ 11如果按值返回,必须在调用点分配临时值,如果使用最新的标准,它的有用性可能不如以前。
相关文章:
- 寿命延长从函数返回引用
- 了解C++如何返回引用并绑定到引用
- 返回引用实例和非引用实例(return mystr & vs mystr)之间的区别是什么?
- 从类返回引用向量
- 使用unique_ptr并返回引用,或者我应该使用shared_ptr并在需要时制作副本
- 混淆C++从函数返回引用
- 两个相同的重载运算符[]一个返回引用
- 为什么向量的.at()成员函数返回引用而不是迭代器
- C++使用和返回引用
- 返回 T 引用的 Const 函子禁止赋值
- 返回引用是否也会延长其生存期?
- 如何返回引用,然后递增迭代器
- 如果使用返回引用的函数初始化"auto"var,为什么它不声明引用类型?
- 我是否需要将 ref 与 make_pair 一起使用才能返回引用?
- 在 vector::at 返回引用后进行更改
- 为什么PyImport_ImportModule返回引用计数为 3 而不是 1 的 PyObject*
- 超出返回引用的单一实例生存期
- Boost.Python 返回引用现有 c++ 对象的 python 对象
- C++ 运算符 += 重载返回引用
- 如何声明接受转发引用并返回引用或副本的函数模板