C++使用结构化绑定移动std::pair元素的正确语法及等效性判断
等效性判断
你给出的写法 auto&& [first_set, second_set] = p; 和原移动构造代码完全不等效。
正确的结构化绑定实现
要实现和原代码完全一致的移动构造效果,写法如下:
auto [first_set, second_set] = std::move(p);
原理说明
- 原代码逻辑:通过
std::move将pair的两个成员转为右值,以此为参数移动构造出两个独立的std::set<int>对象,原pairp的两个成员会进入移后可用状态,新生成的first_set、second_set是和p无关联的独立对象。 - 错误写法的问题:
p是左值,auto&&推导为左值引用,最终first_set、second_set本质是p.first、p.second的左值别名,没有发生任何移动构造,也没有生成新的set对象,操作这两个变量等价于直接修改p的成员,和原代码逻辑完全不同。 - 正确写法的逻辑:
auto代表值捕获,std::move(p)将整个pair转为右值,结构化绑定时会分别用右值pair的first、second成员移动构造独立的set对象,最终效果和原两行移动构造代码完全一致。
内容的提问来源于stack exchange,提问作者user2052436
相关产品推荐
相关产品推荐

