当返回一个容器时,我总是必须确定我应该使用返回值还是使用输出参数。如果性能很重要,我选择了第二个选项,否则我总是选择第一个选项,因为它更直观。
坦率地说,我个人一直强烈反对输出参数,可能是因为我的数学背景,但是当我没有其他选择时使用它们是可以的。
然而,当涉及到泛型编程时,情况已经完全改变了。在某些情况下,函数可能不知道它返回的对象是一个巨大的容器还是一个简单的值。
始终使用输出参数可能是我想知道是否可以避免的解决方案。如果我不得不这样做,那就太尴尬了
int a;
f(a, other_arguments);
相比
auto a = f(other_arguments);
此外,有时 的返回类型f()
没有默认构造函数。如果使用输出参数,则没有优雅的方式来处理这种情况。
我想知道是否有可能返回一个“修饰符对象”,一个接受输出参数的仿函数来适当地修改它们。(也许这是一种惰性求值?)嗯,返回这样的对象不是问题,但问题是我不能插入一个适当的重载赋值运算符(或构造函数),它接受这样一个对象并触发它当返回类型属于我无法触及的库时,请完成它的工作,例如std::vector
. 当然,转换运算符没有帮助,因为它们无法访问为目标对象准备的现有资源。
有人可能会问为什么不使用assign()
; 定义一个具有begin()
&的“生成器对象” end()
,并将这些迭代器传递给std::vector::assign
. 这不是一个解决方案。第一个原因,“生成器对象”没有对目标对象的完全访问权限,这可能会限制可以做的事情。对于第二个也是更重要的原因,我的函数的调用点f()
也可能是一个模板,它不知道确切的返回类型f()
,因此它无法确定assign()
应该使用赋值运算符还是成员函数。
我认为修改容器的“修改器对象”方法应该在过去已经讨论过,因为它根本不是一个新想法。
总结一下,
- 是否可以使用返回值来模拟使用输出参数时会发生什么,特别是当输出是容器时?
- 如果没有,是否将这些支持添加到之前讨论的标准中?如果是,有什么问题?这是一个可怕的想法吗?
编辑
我上面的代码示例具有误导性。该函数f()
可用于初始化局部变量,但也可用于修改在别处定义的现有变量。对于第一种情况,正如 Rakete1111 所提到的,当复制省略开始发挥作用时,按值返回没有问题。但是对于第二种情况,可能会有不必要的资源释放/获取。