C++11返回含const引用的std::tuple时如何正确接收返回值
C++11 返回含引用的std::tuple的接收方案
原代码编译失败的原因是std::tie要求传入的所有参数都是已完成初始化的左值,而C++语法规定引用类型必须在声明时完成初始化,因此未初始化的引用变量无法传入std::tie。无需舍弃tuple改为输出参数,以下是更优的解决方案:
方案1:直接存储tuple返回值后提取元素(C++11原生支持,无侵入性,推荐)
auto ret = func(); const MyType& obj = std::get<0>(ret); bool b = std::get<1>(ret);该方案不需要修改原
func的实现,返回的tuple本身已经持有原对象的引用,std::get<0>提取时不会触发对象拷贝,obj会直接绑定到some_internal_reference,完全符合原始需求,代码可读性也高于输出参数方案。方案2:用
std::reference_wrapper中转(适合必须使用std::tie的场景)std::reference_wrapper<const MyType> obj_ref; bool b; std::tie(obj_ref, b) = func(); const MyType& obj = obj_ref.get();std::reference_wrapper是可重绑定的引用包装类型,支持默认初始化,配合std::tie完成取值后,调用get()即可拿到原生引用。方案3:升级到C++17及以上标准使用结构化绑定(语法最简洁)
auto [obj, b] = func();编译器会自动推导两个变量的类型,
obj会被直接推导为const MyType&,无需手动处理tuple提取逻辑。
内容的提问来源于stack exchange,提问作者Taw
相关产品推荐
相关产品推荐

