OpenCV在分配const引用时逃脱了吗?

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".这里的问题是

  1. 任何编写这样代码的人都应该切断他们的手
  2. 在上述OpenCV的源,没有重新定义operator=该需要Range的参数(Range-相关函数只是上文定义的Vector,起始于线1033)

显然我错过了一些东西,因为openCV源编译.我的问题是,真正意义上的是什么r = Range(0, d.size());使它合法化?

asc*_*ler 7

我注意到cv Vector是一个类模板.因此,如果该类方法从未实例化,则没有编译器错误.我的猜测是,如果你尝试

Vector<int> a;
Vector<int> b(a, Range::all());
Run Code Online (Sandbox Code Playgroud)

你会在那个可疑的行上得到一个编译器错误.然后,您可以将其报告为OpenCV源中的错误.