me encontré con este pedazo de código en la fuente OPENCV (cxoperations.hpp, línea 1134, en la definición de la clase Vector
):OpenCV se escapa con la asignación a una referencia constante?
Vector(const Vector& d, const Range& r)
{
if(r == Range::all())
r = Range(0, d.size());
// some more stuff...
}
Tenga en cuenta que la clase Vector
no tiene un elemento de datos llamado r
(y, de hecho, el identificador r
solo aparece en un lugar más en toda la definición de clase, como un parámetro en otro método). Entonces, aparentemente, hay una asignación a una referencia const
.
he intentado reproducir un ejemplo mínimo:
#include <iostream>
class Foo
{
public:
int _a;
Foo(int a) : _a(a) {}
};
int main()
{
Foo x(0);
const Foo& y = x;
printf("%d\n", y._a);
y = Foo(3);
printf("%d\n", y._a);
}
Esto, por supuesto, falla al compilar: g ++ da el error
test.cpp:15: error: passing `const Foo' as `this' argument of `Foo& Foo::operator=(const Foo&)' discards qualifiers
La única manera que tengo para trabajar es anulando operator=
así:
#include <iostream>
class Foo
{
public:
int _a;
Foo(int a) : _a(a) {}
Foo& operator=(Foo rhs) const
{
Foo& tmp = const_cast<Foo&>(*this);
tmp._a = rhs._a;
return const_cast<Foo&>(*this);
}
};
int main()
{
Foo x(0);
const Foo& y = x;
printf("%d\n", y._a);
y = Foo(3);
printf("%d\n", y._a);
}
esto compila, y representa un "0 3" como se esperaba. El problema aquí es que
- cualquier persona que escribe código como el que debe tener las manos cortadas
- en la fuente OPENCV anteriormente, no hay ninguna redefinición de
operator=
que se lleva aRange
parámetros (Range
funciones relacionados con la PI son justo por encima la definición deVector
, comenzando en la línea 1033)
Obviamente me falta algo, ya que compila la fuente openCV. Mi pregunta es, ¿qué entra realmente en la línea r = Range(0, d.size());
que lo hace legal?
Necesitaremos ver la implementación (o al menos declaración) de Range :: operator = para responder a su pregunta ... – Staffan
Hay un grupo de funciones 'Range :: operator' definidas justo antes de la clase' Vector' , aunque 'operator =' no es uno de ellos. Presumiblemente, es el operador predeterminado implícitamente definido. – suszterpatt