C++ Opencv矩阵范围L值:这是错误吗?

C++ Opencv矩阵范围L值:这是错误吗?,c++,opencv,matrix,range,assignment-operator,C++,Opencv,Matrix,Range,Assignment Operator,在我看来,使用带有范围的矩阵作为L值(赋值目标)应该有效还是无效(如果不是编译器错误就更好),但这两者都不取决于合法r值的细节 cout << "hi mom" << endl; Mat Img0=Mat::zeros(7,7,CV_8UC1); Mat Img1=Mat::ones(7,7,CV_8UC1); cout << Img0 << endl; cout << Img1 << endl; Img0(Range::

在我看来,使用带有范围的矩阵作为L值(赋值目标)应该有效还是无效(如果不是编译器错误就更好),但这两者都不取决于合法r值的细节

cout << "hi mom" <<  endl;
Mat Img0=Mat::zeros(7,7,CV_8UC1);
Mat Img1=Mat::ones(7,7,CV_8UC1);
cout << Img0 << endl;
cout << Img1 << endl;
Img0(Range::all(), Range::all()) = Img1;
cout << Img0 << endl;
Img0(Range::all(), Range::all()) = 1;
cout << Img0 << endl;

不,这不是一个bug。

此行
Img0(Range::all(),Range::all())=Img1无法按预期工作,因为
Img0(Range::all(),Range::all())
形成了一个临时头,该头被进一步分配给另一个头,即
Img1
。请记住,这些操作都是O(1),即不复制任何数据。
因此,不会发生真正的赋值

通过这样做,您可以更清楚地认识到这一效果:

(Img0(Range::all(), Range::all()) = Img1) = 2;
cout << Img0 << endl;
cout << Img1 << endl;

进一步阅读:检查发生在左值上的类似效应。

1)这仍然使左值的基本效应完全依赖于r值。2) 什么这句话的意思是什么?Img0(Range::all(),Range::all())=Img1可能有什么好处;考虑到它的实际功能?据我所知,Img0(Range::all(),Range::all())=Img1与Img1=Img0(Range::all(),Range::all())相同。Img1成为Img0的标头。
(Img0(Range::all(), Range::all()) = Img1) = 2;
cout << Img0 << endl;
cout << Img1 << endl;
[0, 0, 0, 0, 0, 0, 0;
  0, 0, 0, 0, 0, 0, 0;
  0, 0, 0, 0, 0, 0, 0;
  0, 0, 0, 0, 0, 0, 0;
  0, 0, 0, 0, 0, 0, 0;
  0, 0, 0, 0, 0, 0, 0;
  0, 0, 0, 0, 0, 0, 0]
[2, 2, 2, 2, 2, 2, 2;
  2, 2, 2, 2, 2, 2, 2;
  2, 2, 2, 2, 2, 2, 2;
  2, 2, 2, 2, 2, 2, 2;
  2, 2, 2, 2, 2, 2, 2;
  2, 2, 2, 2, 2, 2, 2;
  2, 2, 2, 2, 2, 2, 2]