我想编写几个递归交互的合并函数,我认为应该有签名: T&& merge_XYZ(T&& a, T&& b);
它们倾向于以递归方式使用,例如:
return merge_XYZ( std::move(x), std::move(y) );
这几个合并函数中的每一个都将窃取其中一个输入的内容并将这些内容注入另一个输入并返回结果.通常,它们将具有x
和y
哪些是rvalue引用的名称,因此应该转换回rvalue引用std::move
(如果我错了,请纠正我).
但很少,它们具有x
或者y
说是对其内容不得被盗的对象的引用.我绝对不想写这些函数的替代非窃取版本.相反,我希望呼叫者在这些极少数情况下处理这个问题.所以我的主要问题是,正确的方法是显式调用复制构造,例如:
T temp = merge_QRS( T(x), T(y) ); // use x and y without stealing yet return merge_XYZ( merge_MNO( std::move(x), std::move(y) ), std::move(temp) );
主要问题:是否T(x)
有正确的方法强制在此时创建临时副本?
其他问题:
是否T temp =
有正确的方法来确保merge_QRS
上述代码中的调用在调用之前发生,merge_MNO
但以其他方式便宜地将临时代码转发到第一个操作数中merge_XYZ
?如果我使用T&& temp
它而不是最终持有指针修改T(x)
后的生命T(x)
?
是否T&&
将正确的返回类型(相对于T
)链接在一起?
以上如何比较:
T tx = x; T&& temp = merge_QRS( std::move(tx), T(y) ); // use x and y without stealing yet return merge_XYZ( merge_MNO( std::move(x), std::move(y) ), std::move(temp) );
假设merge_QRS
将修改tx并返回一个rvalue引用,是否所有定义的行为?
写这个问题可以帮助我意识到我可能有两种情况混合在一起,那不应该被混合对象你不想从与对象,你不想从偷偷尚未.merge_QRS( T(y), T(x))
对于我不想偷窃的物品,我的原始权利(仅在相同的表达式中使用)?但在我尝试的情况下,我应该有以下内容:
T tx = x; // Make copies which can be stolen from T ty = y; return merge_XYZ( merge_MNO( std::move(x), std::move(y) ), merge_QRS( std::move(tx), std::move(ty) ) );
我想我可能仍然会对窃取内容与盗取身份感到困惑.如果我回来的话T&&
,除了窃取另一个输入的内容之外,我还窃取了一个输入的标识.我什么时候可以偷走身份?如果我回来,T
我永远不会窃取身份,有时无法窃取身份是低效的.