默认情况下是否应该有任何功能能够就地工作

Should any function be able to work in-place by default

如果我正在为 C++ 构建一个库。有的函数不能接受就地操作可以吗?会不会影响图书馆的标准属性?

例如:

void do_somthing(object const& input, object& output);

int main(){
   object a;
   object b;
   do_somthing(a, b);//OK
   do_somthing(a, a);//wrong
}

如果可以,我应该怎么说呢?例如,我应该断言吗?抛异常?只是把它放在文档中,如果有人坚持调用它,让它产生未定义的行为?

一些说明:

在 OpenCV 库中,像 cv::Canny 这样的一些函数可以像这样工作:

cv::Canny(img,img,100,200);

但是,cv::warpAffine不能像文档中写的那样。

一般来说,识别此类函数的正确方法是让它们return输出值:

object do_somthing(object const& input);

如果您不能让它们return输出值,而您必须改用输出参数,那么do_something应该:

  1. 执行in-place操作。

  2. assert(&input != &output) 或抛出异常。

也就是说,如果您无法处理 in-place 操作,则立即失败。在这些情况下,非常明确地记录这个事实,最好是在函数声明的注释中。

您始终可以自己执行该检查,例如:

   void do_somthing(object const& input, object& output) {
       if (&input == &output) { // error

当然,如果您可以更改函数的签名和 return 更改后的值,您当然可以避免开销并简单地接受 tillaert 的建议:

 object do_somthing(object const& input) {