- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
所以这个static_cast
代码是完全合法的:
int n = 13;
void* pn = static_cast<void*>(&n);
void** ppn = &pn;
然而这必须做成一个reinterpret_cast
才能编译:
int n = 13;
int* foo = &n;
void** bar = static_cast<void**>(&foo);
如果我不更改它,我会得到错误:
error C2440:
static_cast
: cannot convert fromint **
tovoid **
note: Types pointed to are unrelated; conversion requiresreinterpret_cast
, C-style cast or function-style cast
所以我认为问题是“类型不相关”。但我仍然不明白,如果从 int*
到 void*
没关系,它们怎么可能与 int**
无关> 和一个 void**
?
最佳答案
int
与 void
没有任何关系。 int**
和 void**
也是如此,因此它们无法使用 static_cast
进行转换。
void*
然而,特殊。任何数据指针类型(包括 int*
)都可以被static_cast
转换为 void*
并返回,尽管没有类型与 void< 相关
(更进一步,到 void*
的转换不需要转换,因为它是隐式的)。 int*
没有此属性,void**
也没有,除了 void*
之外的任何其他指针也没有。
授予 void*
的额外自由伴随着额外的限制。 void*
不能间接使用,也不能与指针运算一起使用。这些限制是唯一可能的,因为永远不会有 void
类型的对象。或者从相反的角度来看,由于这些限制,void
的对象不可能存在。
void**
不能被赋予这些自由,因为它不能被赋予相同的限制。它不能被赋予这些限制,因为 void*
对象确实存在并且它们需要存在。如果我们不能间接或迭代 void**
,那么我们就不能使用 void*
的数组。
关于c++ - 为什么我必须重新解释_cast 指针指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52449090/
我需要用来自 /dev/urandom 的数据填充一个整数类型变量(任意大小)。考虑到这一点,我有以下代码: std::fstream fstr("/dev/urandom", std::fstrea
我是一名优秀的程序员,十分优秀!