【发布时间】:2017-12-24 09:54:04
【问题描述】:
据我所知,foo->bar() 与(*foo).bar() 相同,除了箭头以一种奇怪的方式超载时,通常不应该这样做。 This answer 似乎同意。
然而这似乎不适用于 boost::shared_ptrs。以上是我的两行代码,在某些情况下会产生不同的结果:
(*new_link).getRefNode() // returns some value
new_link->getRefNode() // returns something different...
我在这里错过/不理解什么?
编辑:根据要求,cout 代码和打印的内容。我确保 getRefNode() 不会以任何方式修改实例 - 如果我更改调用的顺序,值会随着调用而更改,因此它与 getRefNode() 内部所做的任何事情无关。
std::cout << "BLink1: " << (*previous_link).getId().toStdString()
<< ", ref: " << (*previous_link).getRefNode()
<< ", nref: " << (*previous_link).getNrefNode()
<< std::endl << "Link2: " << (*new_link).getId().toStdString()
<< ", ref: " << (*new_link).getRefNode()
<< ", nref: " << (*new_link).getNrefNode() << std::endl;
std::cout << "New link: " << new_link->getId().toStdString()
<< ", ref: " << new_link->getRefNode()
<< ", nref: " << new_link->getNrefNode() << std::endl;
BLink1: 1076889319, ref: (48.68674, 8.99122), nref: (48.68682, 8.99368)
Link2: 1076570435, ref: (48.68674, 8.99122), nref: (48.68682, 8.99368)
新链接:1076570435,参考:(48.68669,8.98889),nref:(48.68674,8.99122)
(我的亮点)
【问题讨论】:
-
告诉我:如果你颠倒调用顺序(即先调用
->),第三行中的值会移到第二行吗? -
好吧,
boost::shared_ptr<T>在应用operator->时返回一个T*。在我看来,这种扰动就像是你班上某个地方的 UB 指标。 -
operator*返回一个引用,operator->返回一个应该指向同一事物的指针。如果您怀疑它实际上指向其他东西,请将其与operator*的结果地址一起打印并验证。如果它们是相同的,那么operator*和 ``operator->` 工作正常并且错误在别处。 -
What operator-> 返回 is 一个地址。你打印它。
cout << smartptr.operator->();.
标签: c++ pointers boost shared-ptr