这个C ++的演员代码在做什么?

时间:2014-08-21 01:40:05

标签: c++ casting semantics

在此处找到:https://github.com/tpaviot/oce/blob/master/src/BRepAdaptor/BRepAdaptor_Curve.cxx

我想知道的是:

((GeomAdaptor_Curve*) (void*) &myCurve)->Load(C,First,Last);

myCurve已定义为GeomAdaptor_Curve。所以看起来它正在指向myCurve作为void*的指针,然后将 作为GeomAdaptor_Curve*投射,然后取消引用它并调用{{1} }} 在上面。可能有什么理由这样做,而不是简单地调用Load

2 个答案:

答案 0 :(得分:6)

请注意,该语句出现在const成员函数中。因此&myCurve的类型实际上是GeomAdaptor_Curve const*。这似乎是一种丑陋而令人困惑的说法

const_cast<GeomAdaptor_Curve&>(myCurve).Load(C,First,Last);

并且可能已经变得更加复杂,以便“避免”尝试使用C风格的强制转换来绕过const而获得的编译器警告。

答案 1 :(得分:0)

我能想到的唯一原因是确保GeomAdaptor_Curve&#34;的类型&#34;子类的变量。被迫调用超类的Load函数。

转换为void*,然后转到GeomAdaptor_Curve*,可以保证该类型被视为后者,无论其实际类型如何。

在查看了代码之后,我无法确定这是一种可能性,因此它可能是遗留代码或者他们未来扩展的内容。

可能值得联系GitHub上的dbarbier用户,因为他们似乎对变更负有全部责任(基于历史记录)。

虽然,因为那段代码似乎是最早的GitHub版本,如果你能找到它们,原作者可能是更好的选择(参见一个Remi LEQUETTE的文件头)。