假设 A* pA;
和 B* pB;
,下面这些类型转换(查询所有C++风格的转换)有任何区别吗:
pB = reinterpret_cast<B*>(pA); // pointer
pB = reinterpret_cast<B*&>(pA); // pointer-reference
++ reinterpret_cast<B*>( pA );
虽然是非法的,但是:
++ reinterpret_cast<B*&>( pA );
这是一种有用的代码混淆技术,可以获得未对齐指针、指向对象中间或其他不敢解引用的指针。
通常情况下,应避免使用第二种形式,但有时会有例外。Posix保证所有指针(包括指向函数的指针,但不包括指向成员的指针-Posix指定了C ABI,它没有指向成员的指针)具有相同的大小和格式,因此第二种形式是保证可行的。而且这是唯一的合法方式将dlsym
返回的void*
转换为指向函数的指针:
int (*pf)( int );
reinterpret_cast<void*&>( pf ) = dlsym( handle, "functionName" );
int (*pf)( int );
*(void**)( &pf ) = dlsym( handle, "functionName" );
reinterpret_cast
是实现定义的。理论上结果可能不同,但在实践中,您可以假设结果将是相同的,因为 typeid(B*)
等于 typeid(B*&)
=> 实际上在两种情况下都转换为相同的类型。
没有任何功能上的区别。
如果你使用后一种变体,显然会有可维护性的差异。你的同事可能会认为你吸了什么东西。 ;-)
没有任何区别。
pB = reinterpret_cast<B*>(pA); // pointer
将类型转换为指针B*
。
pB = reinterpret_cast<B*&>(pA); // pointer-reference
将引用强制转换为指针。
注意:不存在指向引用的指针。