sus*_*att 5 c++ opencv const reference
我偶然发现了openCV源代码中的这段代码(cxoperations.hpp,第1134行,在Vector
类的定义中):
Vector(const Vector& d, const Range& r)
{
if( r == Range::all() )
r = Range(0, d.size());
// some more stuff...
}
Run Code Online (Sandbox Code Playgroud)
请注意,Vector
该类没有调用数据成员r
(实际上,标识符r
仅出现在整个类定义中的另一个位置,作为另一个方法中的参数).显然,这是对const
参考的任务.
我试图重现一个最小的例子:
#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);
}
Run Code Online (Sandbox Code Playgroud)
当然,这无法编译:g ++给出了错误
test.cpp:15: error: passing `const Foo' as `this' argument of `Foo& Foo::operator=(const Foo&)' discards qualifiers
Run Code Online (Sandbox Code Playgroud)
我让它工作的唯一方法是覆盖operator=
这样:
#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);
}
Run Code Online (Sandbox Code Playgroud)
这将编译,并按预期打印"0 3".这里的问题是
operator=
该需要Range
的参数(Range
-相关函数只是上文定义的Vector
,起始于线1033)显然我错过了一些东西,因为openCV源编译.我的问题是,真正意义上的是什么r = Range(0, d.size());
使它合法化?
我注意到cv Vector
是一个类模板.因此,如果该类方法从未实例化,则没有编译器错误.我的猜测是,如果你尝试
Vector<int> a;
Vector<int> b(a, Range::all());
Run Code Online (Sandbox Code Playgroud)
你会在那个可疑的行上得到一个编译器错误.然后,您可以将其报告为OpenCV源中的错误.