C++ 与;(*similarObject)和similarObject?它们不一样吗?

C++ 与;(*similarObject)和similarObject?它们不一样吗?,c++,dynamic,casting,C++,Dynamic,Casting,有人能给我解释一下吗 dynamic_cast<SomeObject *>( &(*similarObject) ); dynamic_cast(&(*similarObject)); 对解引用指针的地址执行操作的意义是什么?指针本身不是它的地址吗?可能是similarObject的类型重载了运算符*,因此它返回的是您要传递给dynamic\u cast的地址 &(*x)和x可能并不总是一回事。例如,想想迭代器: std::map<int, int>::ite

有人能给我解释一下吗

dynamic_cast<SomeObject *>( &(*similarObject) );
dynamic_cast(&(*similarObject));

对解引用指针的地址执行操作的意义是什么?指针本身不是它的地址吗?

可能是
similarObject
的类型重载了
运算符*
,因此它返回的是您要传递给
dynamic\u cast
的地址

&(*x)
x
可能并不总是一回事。例如,想想迭代器:

std::map<int, int>::iterator it = v.begin();
std::map::iterator it=v.begin();
那么
it
&(*it)
是两件不同的事情:

  • it
    的类型是
    std::map::iterator
  • &(*it)
    的类型是
    std::pair*

他们完全不一样。类似的情况也可能发生在您的代码片段上。

如果similarObject是智能指针,则当*重载时,此技术有时用于获取原始指针的引用。

还没有人提到
similarObject
是左值,而
&*similarObject
是右值。

similarObject是智能指针吗?当*被重载时,这种技术有时用于获取原始指针的引用。运算符的解引用和地址是否可能被重载?@DanDan:将此作为答案。&*也称为“不智能”运算符。括号是不必要的。Is
similarObject
是空指针,这将调用未定义的行为(至少在当前标准中是这样)。此外,如果
similarObject
是共享指针或类似的东西,则可能会导致泄漏(对于此用途,存在
dynamic\u pointer\u cast
)。另外,
someObject
可以是迭代器,而不是指针。我有时使用
&*v.begin()
而不是
&v[0]
来获取指向
std::vector
@Alexandre:在这种情况下,我发现
&v[0]
很容易理解,因此我更喜欢它而不是
&v.begin()
。我过去常常找到
&v[0]
也更容易,但现在不行了。口味会随着时间而变化。@Alexandre:你是说你以前觉得
&v[0]
更容易,后来你出了事故,开始觉得很难了P:Dsquare括号很难在法国键盘上输入,使用
v.begin()
一直让我很高兴:)。关键是“
&*
操作符”有一些用处。
auto_ptr
以及Boost和tr1智能指针都有一个函数来实现这一点,
.get()
&*similarObject
不必是右值。它也可以是左值。@Nawaz:仅当您重载一元
&
运算符以返回引用时。这是你绝对不应该做的。