gpt4 book ai didi

c++ - OpenCV 摆脱了分配给 const 引用的麻烦?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:12:58 26 4
gpt4 key购买 nike

我在 openCV 源代码中偶然发现了这段代码(cxoperations.hpp,第 1134 行,在 Vector 类的定义中):

Vector(const Vector& d, const Range& r)
{
if( r == Range::all() )
r = Range(0, d.size());

// some more stuff...
}

请注意,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);
}

这当然无法编译:g++ 给出了错误

test.cpp:15: error: passing `const Foo' as `this' argument of `Foo& Foo::operator=(const Foo&)' discards qualifiers

我让它工作的唯一方法是像这样覆盖 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);
}

这会编译并按预期打印“0 3”。这里的问题是

  1. 任何写这种代码的人都应该砍掉他们的手
  2. 在上面的 openCV 源代码中,没有重新定义接受 Range 参数的 operator=(Range 相关函数就在上面Vector 的定义,从第 1033 行开始)

显然我遗漏了一些东西,因为 openCV 源代码可以编译。我的问题是,在 r = Range(0, d.size()); 行中究竟发生了什么使其合法?

最佳答案

我注意到 cv 的 Vector 是一个类模板。因此,如果该类方法从未实例化,则不会出现编译器错误。我的猜测是,如果您尝试

Vector<int> a;
Vector<int> b(a, Range::all());

你会在那个看起来可疑的行上得到一个编译器错误。然后您可以将其报告为 OpenCV 源代码中的错误。

关于c++ - OpenCV 摆脱了分配给 const 引用的麻烦?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4328955/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com