更新:

  • 因此,根据Jean的评论,我看了this link。这实际上与我要问的问题很接近。唯一的区别是它显式地处理了类(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::UMatsalpha, beta

    至今

    我做了一点research,发现std::move(input)显式返回了rvalue类型的临时类。因此,抛出错误是有道理的。

    我意识到我可以通过首先执行以下操作来解决此问题:
    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类型正在进行一些时髦的转换。



    我要在运行时方面寻求最有效的解决方案。另外,我不希望这个问题仅限于OpenCV案例;获得使用std::move(input)调用的任何类型的函数的答案,将不胜感激。

    最佳答案

    我认为您在函数的输入参数中缺少了const。尝试如下:

    UMat addUMats(const UMat & M1, const UMat & M2) {
        UMat returnMat;
        add(M1, M2, returnMat);
        return move(returnMat);
    }
    

    可能不是唯一的问题,但就目前而言,您的函数不能将临时变量作为输入,因为它假定可以在函数内部对其进行修改。

    07-24 21:42