C++返回const引用的函数赋值给auto变量的类型推导及选型问题
类型对比结论
四个变量的类型并不完全一致,每个变量的具体类型和特性如下:
v1:类型为className,属于独立的拷贝对象。auto值推导会自动丢弃表达式的引用、顶层const限定符,所以这里会调用拷贝构造函数生成和原对象无关的新实例,存在额外拷贝开销,修改v1也不会影响f()返回的原对象。v2:类型为const className&,属于指向原对象的const左值引用。auto&推导会保留底层const限定符,没有拷贝开销,不可通过v2修改原对象。v3:类型为const className&,和v2完全一致。写法上显式标注了const,代码可读性更强。v4:类型为const className&,和v2、v3完全一致。decltype(auto)会完全保留表达式的原始类型,没有额外开销,但可读性最差。
实际开发选型建议
根据不同场景选择对应写法:
- 如果你明确需要独立的可修改副本,或者需要变量的生命周期长于f()返回的原对象生命周期,优先选择
auto v1 = f()的写法,建议加注释标注是故意做的拷贝,避免其他开发者误以为是漏写了引用。 - 绝大多数仅需要读取对象、不需要修改原对象的普通业务场景,优先选择
const auto& v3 = f()的写法:- 显式标注const,代码意图非常清晰,其他开发者一眼就能知道这个变量是只读的
- 相比
auto& v2的写法更安全:如果后续f()的返回值调整为非const引用,显式的const可以避免你误修改原对象,编译期就能拦截错误 - 相比
decltype(auto)可读性高得多,普通场景下完全不需要用decltype(auto),只有泛型编程中需要完全保留返回值类型的场景才适合使用。
内容的提问来源于stack exchange,提问作者Bruice
相关产品推荐
相关产品推荐

