C++如何用结构化绑定替换指针输出参数且避免变量遮蔽?
移除指针输出参数并解决结构化绑定遮蔽问题
原代码场景
最初通过指针作为输出参数获取两个返回值:
int res2; int res1 = fancy_computation(blah, &res2); if (condition(res1)) res1 = fancy_computation_but_slightly_different(blah2, &res2); // 使用res1和res2执行后续逻辑
尝试结构化绑定遇到的问题
改用结构化绑定后,第二次绑定会遮蔽外层变量,触发项目的错误级警告:
auto [res1, res2] = fancy_computation(blah); if (condition(res1)) auto [res1, res2] = fancy_computation_but_slightly_different(blah2); // 内层变量遮蔽外层,触发警告 // 使用res1和res2执行后续逻辑
可行解决方案
方案1:用中间载体存储结果(推荐)
让fancy_computation和fancy_computation_but_slightly_different返回一个包含两个结果的结构体(或std::pair),通过中间变量承接结果,彻底避免变量遮蔽:
// 自定义返回结构体(语义比std::pair更清晰) struct ComputationResult { int res1; int res2; }; // 调整两个函数返回ComputationResult类型 ComputationResult fancy_computation(BlahType blah); ComputationResult fancy_computation_but_slightly_different(Blah2Type blah2); // 实际使用逻辑 auto current_result = fancy_computation(blah); if (condition(current_result.res1)) { current_result = fancy_computation_but_slightly_different(blah2); } // 最后用结构化绑定解构出变量 auto [res1, res2] = current_result; // 使用res1和res2执行后续逻辑
如果不想自定义结构体,用std::pair<int, int>作为返回类型也可实现相同效果,仅语义清晰度稍弱。
方案2:借助std::tie直接赋值(灵活备选)
若维护者只是反感std::tie的语法形式而非功能,可直接用它给外层变量赋值,无需重新绑定:
auto [res1, res2] = fancy_computation(blah); if (condition(res1)) { std::tie(res1, res2) = fancy_computation_but_slightly_different(blah2); } // 使用res1和res2执行后续逻辑
注意此方案依赖std::tie,若团队明确拒绝则优先采用方案1。
内容的提问来源于stack exchange,提问作者Dubslow
相关产品推荐
相关产品推荐

