&(*similarObject) 和similarObject 之间的区别?他们不一样吗?
Posted
技术标签:
【中文标题】&(*similarObject) 和similarObject 之间的区别?他们不一样吗?【英文标题】:Difference between &(*similarObject) and similarObject? Are they not same? 【发布时间】:2011-10-20 23:21:00 【问题描述】:谁能给我解释一下
dynamic_cast<SomeObject *>( &(*similarObject) );
解引用指针的地址有什么意义?指针本身不就是它的地址吗?
【问题讨论】:
similarObject 是智能指针吗?当 * 被重载时,这种技术有时用于获取原始指针的引用。 解引用和地址操作符是否重载了? @DanDan:把这个作为答案。 &* 也称为“不智能”运算符。括号是不必要的。 IssimilarObject
是一个空指针,这会调用未定义的行为(至少在当前标准中)。此外,如果similarObject
是共享指针或类似的东西,您就会引入潜在的泄漏(有dynamic_pointer_cast
用于此用途)。 someObject
也可以是迭代器,而不是指针。
【参考方案1】:
可能是similarObject
的类型重载了operator*
,因此它返回了您要传递给dynamic_cast
的地址。
&(*x)
和 x
可能不总是相同的东西。例如,想想迭代器:
std::map<int, int>::iterator it = v.begin();
那么it
和&(*it)
是两个不同的东西:
it
的类型是std::map<int, int>::iterator
&(*it)
的类型是std::pair<int,int>*
他们不完全一样。您的 code-sn-p 也可能发生类似的事情。
【讨论】:
我有时使用&*v.begin()
而不是&v[0]
来获取指向std::vector
开头的指针。
@Alexandre:在这种情况下,我觉得&v[0]
很容易理解,所以我更喜欢它而不是&*v.begin()
。
我以前也更容易找到&v[0]
,但现在不是了。口味会随着时间而变化。
@Alexandre:你的意思是你以前更容易找到&v[0]
,然后你出了事故,你开始觉得很难? :P :D
方括号很难在法语键盘上输入,并且始终使用v.begin()
让我很高兴:)。关键是“&*
operator”有一些用处。【参考方案2】:
如果similarObject是一个智能指针,当*已经被重载时,这个技术有时被用来获取一个原始指针的引用。
【讨论】:
auto_ptr
和 Boost 和 tr1 智能指针都有一个功能,.get()
【参考方案3】:
还没有人提到similarObject
是左值,而&*similarObject
是右值。
【讨论】:
&*similarObject
不必是右值。它也可以是左值。
@Nawaz:仅当您重载一元 &
运算符以返回引用时。这是你绝对不应该做的事情。以上是关于&(*similarObject) 和similarObject 之间的区别?他们不一样吗?的主要内容,如果未能解决你的问题,请参考以下文章