更新:
- 因此,根据 Jean 的评论,我查看了此链接。这实际上非常接近我要问的问题。唯一的区别是它明确地处理类(这
cv::UMat
无疑是);但是,我尝试对返回类型进行的功能嵌套是否仍然有效?是否仍会出现复制省略,并达到预期的结果?
问题
我目前正在使用 OpenCV 的cv::UMat
对象类,我的同事编写了一个函数来进行cv::UMat
添加,如下所示:
UMat addUMats(UMat & M1, UMat & M2){
UMat returnMat;
add(M1, M2, returnMat);
return move(returnMat);}
现在,如果我这样称呼它,这很好用:
cv::UMat A = data1;
cv::UMat B = data2;
cv::UMat C = addUMats(A, B);
但是,当我尝试将函数作为参数传递给函数时,出现“参数必须是左值”类型错误。例如,
cv::UMat A = addUMats(addUMats(alpha, beta), addUMats(alpha, beta));
对于任何有效cv::UMats
的 , alpha, beta
。
至今
我做了一些研究,发现它std::move(input)
显式地返回了一个右值类型的临时值。因此,抛出错误是有道理的。
我意识到我可以通过首先执行以下操作来解决此问题:
cv::UMat inputA = addUMats(alpha, beta);
cv::UMat A = addUMats(inputA, inputA);
或者,我什至可以做类似的事情,
UMat addUMats(UMat & M1, UMat & M2){
UMat returnMat;
add(M1, M2, returnMat);
return returnMat;}
在这种情况下,我的理解是该行将return returnMat
导致一个 deep(?) 临时被复制。
问题
所以,我知道这里可能会发生一些依赖于 OpenCV 的事情;就像,也许是因为 UMat 类型正在进行一些时髦的铸造等。
但是,在一般情况下,适应函数的最佳方法是
addUmats
能够将函数作为对函数的调用?
在运行时方面,我将寻求最有效的解决方案。另外,我不希望这个问题仅限于 OpenCV 案例;获得使用该std::move(input)
调用的任何类型函数的答案将不胜感激。