【发布时间】:2020-11-17 22:50:13
【问题描述】:
我一直试图理解类型转换和类型转换之间的区别。我学到的是,本质上,当一种类型的基础值或位表示更改为另一种值时,我们已经执行了转换。在纯类型转换中,我们只是告诉编译器将位模式视为另一种类型。我使用了“纯”,因为强制转换可能会导致转换,在这种情况下,它被称为“显式转换”。
我想了两个例子来说明这种差异。 第一:
float x = 1.5;
float* p1 = &x;
int* p2 = (int*) p1;
int i = *p2;
这里转换指针类型不会对指针值进行任何操作。所以这是纯粹的铸造。在这种情况下,它会导致未定义的行为,因为我们根据 f1.5 的位表示得到 int 值,准确地说是 1069547520。
第二:
B* b = new D();
D* d = static_cast<D*>(b);
其中 D 派生自 B。这里在第一行进行了隐式转换。在第二行也是,强制转换实际上是一种转换。这些是转换,因为指针值可能会改变,必要时调整值以指向完整的 D 对象或 B 子对象(我还没有完全理解偏移是如何工作的不过。)
调用用户定义类转换的指针转换是否正确?如果是这样,那么上面的 static_cast 也执行了转换(显式),而我读到的这个答案调用了一个完全不同的概念:
https://stackoverflow.com/a/34268988/1219638-
标准转换是具有内置含义的隐式转换,是与 static_cast 或 C 样式转换等不同的概念。
还有为什么用户定义的类指针的转换称为标准转换?
我可以问最后一个问题吗?我了解到,当类型相关时,C 风格的转换将像 static_cast 一样。这是否意味着 C 风格的转换也会在必要时计算偏移量?
【问题讨论】:
-
在我的生活中,除了 c 风格的演员表之外,我从来没有使用过任何东西。
-
第一个例子是UB,见strict aliasing rule。
-
每个问题请回答一个问题。似乎可以归结为“强制转换和转换之间有什么区别”,但问题可能更清楚
-
@IlianZapryanov 类型双关语在 C++ 中是不允许的(在 C 中是这样)
-
有隐式转换和显式转换。强制转换是显式转换。所有的转换都会创造新的价值,并且永远不会改变任何东西。新值的表示是否与原始值的表示不同是无关紧要的。