C++型铸造.static_cast什么时候会成功,reinterpret_cast会导致问题?
C++ type casting. When will static_cast succeed and reinterpret_cast will cause an issue?
我知道static_cast
是从一种类型到另一种类型的转换,(直观地(是一种在某些情况下可以成功并且在没有危险转换的情况下有意义的转换。同时,reinterpret_cast
是表示不安全转换的强制转换,可能会将一个值的位重新解释为另一个值的位。
有人可以描述代码编译、强制转换和static_cast
不会导致问题的场景,但有了reinterpret_cast
就会有问题吗?
这将做到这一点:
#include <iostream>
using namespace std;
struct C{int n;};
struct A{int n;};
struct B : A, C{};
int main()
{
B b;
B* pb = &b;
cout << static_cast<C*>(pb) << "n";
cout << reinterpret_cast<C*>(pb);
}
请注意两个地址的差异。
我在这里构建了一些多重继承,并在基类中放置了一个显式成员,以规避空基类可能优化为零的大小。
请参阅 https://ideone.com/QLvBku
最简单的情况是 reinterpret_cast<void*>(NULL)
,它可能产生一个非空指针。
相比之下,static_cast<void*>(NULL)
是安全的,因为它需要生成空指针。
为什么? NULL
是一个等于 0 的整数常量。 static_cast
要求将 0 转换为适当的 null 指针,但reinterpret_cast
没有相同的要求。如果空指针的内部表示形式与整数零的内部表示形式不同,则结果将不同。这种类型的破坏最有可能发生在具有分段寻址的体系结构上。
其中一种情况是多重继承 - static_cast
调整地址(因此强制转换后基对象指针的地址可以不同于派生对象地址,以指向正确的基类项(。
reinterpret_cast
不执行任何地址调整,因此强制转换为基类可能会使用错误的地址(即始终返回派生对象的地址不变(。
相关文章:
- 如何理解C++标准N3337中的expr.const.cast子句8
- C++Cast运算符过载
- 错误:"cast"未命名类型void setCastDescription(std::string
- 通过使用 const-cast 的非常量引用来延长临时的寿命
- "(void) cast"与功能有什么区别 "__attributes__"来沉默未使用的参数警告?
- C++:"Expected '(' for function-style cast or type construction"错误
- 为什么选择 g++ 给予者:"error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast]"
- Gtk+ g_signal_connect() 和 C++ lambda 会导致"invalid cast"错误
- Shared_ptr cast vs static_cast speed
- C++20 中的严格别名规则是否允许标准 c++ unicode 字符和下划线类型之间"reinterpret
- 在 iOS 上使用 Aruco 构建 OpenCV 时"Functional-style cast from id to double is not allowed"
- 覆盖 CAST 运算符(我认为它被称为向下转换)
- C++错误,隐 <function-style-cast> 式要求使用模板化类一次调用多个构造函数的多个转换
- 如何修复<function-style-cast>错误:无法从'initializer list'转换为asdending比较<W>(模板函子)
- C++ C++ 中的函数声明,键入 CAST
- static_cast会丢弃错误,但C风格的演员cast有效
- C++ cast char * to unsigned char
- 禁用 Clang 中的"cast from pointer to smaller type uint32_t"错误
- 是否可以使用gcc 3.3版修复与int*cast相关的Sun Solaris OS 5.8分段故障
- C++ const-cast 一个引用