C++函数调用的小问题

如下图所示 RRTstar类继承了Planner类, Planner::getPlannerData(data)这行代码我可以理解,引用在定义时需要添加&,在使用时不能添加&。将形参通过引用的方式传递给实参。

img

在 data.addStartVertex(base::PlannerDataVertex(motion->state))行代码中,addStartVertex的定义如下图所示。在定义中明明定义了引用&v,

但在调用的过程中却输入了base::PlannerDataVertex(motion->state),这一点是我不能理解的。

img

下图是关于PlannerDataVertex类的一些信息。

img

下图是关于Motion类的一些信息。

img

我的问题就是为什么data.addStartVertex在调用过程中与 Planner::getPlannerData的调用方式不一样,我能理解Planner::getPlannerData的调用方式,但是理解不了data.addStartVertex调用的逻辑关系。

问题清晰明了,你适合做程序猿。。。。哈哈。。。
首先,你getPlannerData 的形参是什么?是 PlannerDataVertex 类型的对象的引用。。。也就是说,它的实参应该是 PlannerDataVertex 类型的对象,这个你明白吧?
其次,base::PlannerDataVertex(motion->state) 这句话是干嘛的?这不就是构造函数吗?参数是 state,还有个默认参数,那你说,构造函数创建的是什么?对象。。。
ok。。。。
一个创建了对象,一个把这个对象作为实参传递了。。。
相信你理解了

base::PlannerDataVertex(motion->state)创建了一个零时对象,调用data.addStartVertex()时,形参的引用绑定到这个零时对象,这个临时对象的生命期就延长至这个引用的生命期。这个过程在C++里叫着Temporary materialization
https://en.cppreference.com/w/cpp/language/implicit_conversion#Temporary_materialization