在围绕函数修改其参数(输出参数)的情况下创建包装器是一种好习惯吗?我们希望保持调用者的状态?
有没有更好的方法来实现这一目标?
下面的示例是一个递归函数,它将在每次递归时修改其参数。我们通过引用保存副本。问题在于它将修改呼叫者的状态,并且用户必须考虑这种副作用。
// Wrapper to return by value
// Example of caller
T1 data_1 = ...
T2 data_2 = ...
T3 result = foo(data_1, data_2);
T3 foo(T1 data_1, T2 data_2) // copy
{
T3 result{};
foo(data_1, data_2, result);
return result;
}
void foo(T1 &data_1, T2 &data_2, T3 &result)
{
// ...
foo(data_1.modify(), data_2.modify(), result);
}
// Alternative, out parameter by reference, will modify data_1 and data_2
// Example of caller
T1 data_1 = ...
T2 data_2 = ...
T3 result{};
foo(data_1, data_2, result);
void foo(T1 &data_1, T2 &data_2, T3 &result)
{
// ...
foo(data_1.modify(), data_2.modify(), result);
}
答案 0 :(得分:0)
很好,而且如果您在移动语义之前编写了代码,这种情况并不罕见,尤其是对于较旧的编译器而言,它在复制省略方面可能很弱。
您说的更清楚,通常可以很好地进行优化,并节省了在呼叫站点声明本地临时人员的工作。
如果您的类型不能移动或默认构造,则仍可以使用旧界面。