C++ 重新解释\u cast和静态\u cast-这里有什么区别?
对于某些可以转换为T*的类型a,C++ 重新解释\u cast和静态\u cast-这里有什么区别?,c++,C++,对于某些可以转换为T*的类型a,静态转换(静态转换(a))==重新解释转换(a),这通常是正确的吗。在什么情况下,这是不正确的?下面我举了一个例子来说明这一点: #include <iostream> #include <string> int main() { std::string a = "Hello world"; float* b = static_cast<float*>(static_cast<void *>(&a[
静态转换(静态转换(a))==重新解释转换(a)
,这通常是正确的吗。在什么情况下,这是不正确的?下面我举了一个例子来说明这一点:
#include <iostream>
#include <string>
int main() {
std::string a = "Hello world";
float* b = static_cast<float*>(static_cast<void *>(&a[0]));
float* c = reinterpret_cast<float*>(&a[0]);
std::cout << (b == c) << std::endl; // <-- This prints 1
}
#包括
#包括
int main(){
std::string a=“Hello world”;
float*b=静态施法(静态施法(&a[0]);
float*c=重新解释铸件(&a[0]);
std::cout另一个指针的静态转换到/从void*
与reinterpret\u cast
相同
使用指向非浮点的指针作为指向浮点的指针可能是错误的,包括将一个指针值与另一个指针值进行比较这样无害的事情
这背后的一个硬件原因是,在某些平台上,浮点具有强制对齐,而在两个float*
上的=
可能会假定它们指向对齐的值。在至少一个平台上,由于没有字节寻址,所以char*
和void*
都比float*
占用更多内存在平台上,字节寻址是通过存储额外的“偏移量”和在引擎盖下执行位屏蔽操作来模拟的
在其他平台上,完全不同的地址空间被用于不同类型的指针。我所知道的一个平台的函数和值地址空间是不同的
该标准考虑到了这些怪癖,并为了允许某些优化,没有完全定义当您使用类型错误的指针时会发生什么。实现可以自由地记录它们的行为就像您可能期望但未被强制执行的平面内存模型
我不记得这是实现定义的(这意味着他们必须记录它是定义的还是UB)还是这里的UB(这意味着编译器可以自由定义它的行为,但不必)
对于T*
完全有效和正确的类型(即,实际上有一个T
类型的对象,我们只是有一个指向它的void*
或char*
的指针,或者类似的东西),然后在每种情况下静态_cast(static_cast(addy))==reinterpret_cast(addy)
别名问题——指针指向错误的类型——非常棘手。您是在问这是否“一般”有效,还是定义了行为?@NeilButterworth代码说明了这个问题。问题并不完全是关于代码。可能的重复不是直接问题,而是