调用值返回函数时,局部变量应使用引用还是副本赋值?
嘿,咱们先把这段C++相关的内容整理得明明白白,顺便聊聊你和队友的这个代码风格分歧~
我们现有的值返回函数
首先是咱们定义的几个返回对象的函数:
Foo function_1(){ Foo f; // ... 一些初始化逻辑 return f; } Bar function_2(){ Bar b; // ... 一些初始化逻辑 return b; } Baz function_3(){ Baz b; // ... 一些初始化逻辑 return b; }
我当前的实例化写法
我现在是直接通过调用这些函数创建局部变量:
void example(){ //... 其他代码 const auto foo = function_1(); //... 其他代码 const auto bar = function_2(); //... 其他代码 const auto baz = function_3(); }
队友的修改要求
不过队友一直要求我把所有实例化改成使用**const auto&**的形式,也就是把变量声明为常量引用:
void example(){ //... 其他代码 const auto& foo = function_1(); //... 其他代码 const auto& bar = function_2(); //... 其他代码 const auto& baz = function_3(); }
额外补充点小知识(供你和队友讨论)
其实在现代C++(C++11及以后)里,这两种写法的性能差异几乎可以忽略:
- 直接赋值的写法会触发返回值优化(RVO/NRVO),编译器会跳过临时对象的创建和拷贝,直接在目标变量的内存位置构造对象,不会有额外开销。
- 使用
const auto&的话,会延长函数返回的临时对象的生命周期,同样也不会有拷贝操作,而且写法上更强调“不修改这个对象”的语义。
所以两种写法都是合理的,可能队友是出于代码风格的统一,或者想明确表达变量的只读属性才提出这个要求~
内容的提问来源于stack exchange,提问作者Trevor Hickey
相关产品推荐
相关产品推荐

