C++中的类型转换:相关类型和不相关类型
Type conversion in C++: related and unrelated types
我正在阅读Bjarne Stroustrup的"C++编程语言"来学习C++,遇到了以下文章:
static_cast
运算符在相关类型之间转换,例如在同一类层次结构中从一个指针类型转换为另一个,从整型转换为枚举,或从浮点类型转换为整型。reinterpret_case
处理不相关类型之间的转换,例如指向指针的整数或指向不相关指针类型的指针。
对我来说,不清楚是什么决定了任何两个给定的类型是相关的还是不相关的,所提到的例子似乎也不那么详尽。
斯特劳斯特鲁普说,类型分为1。算术类型2。用户定义的类型和3。内置类型,从上面的例子来看,他认为算术类型(int)与用户定义的类型(enum)相关。从浮点类型到int是显而易见的,因为它们都是算术类型。
然而,他将两个指针分类为不相关的,根据他的定义,这两个指针都应该是内置类型。
那么,我们说"两种类型是相关的(不相关的)"到底是什么意思呢?
在下面的例子中,类型A和B是相关的,而类型A和C以及B和C是不相关的:
class A
{
...
};
class B : public A
{
...
};
class C
{
...
};
一般来说,我认为类型X和Y是相关的当且仅当以下条件之一成立:
- X继承自Y
- Y继承自X
- X有一个构造函数,它引用Y对象,意思是X::X(Y&Y)
- Y有一个构造函数,它引用X对象,意思是Y::Y(X&X)
- X有一个到Y的强制转换运算符,意思是X::运算符Y()
- Y有一个到X的强制转换运算符,意思是Y::运算符X()
如果两种类型通过继承的方式属于同一类层次结构,则它们是相关的。
static_cast运算符在相关类型之间进行转换,例如在同一类层次结构中从一个指针类型转换为另一个,从整型转换为枚举,或从浮点类型转换为整型。interpret_case处理不相关类型之间的转换,例如指向指针的整数或指向不相关指针类型的指针。
此文本似乎有点引用错误,因为它似乎暗示(整型和枚举型)以及(浮点型和整型)是相关的。我认为文本的意思是:
static_cast
运算符在指向相关类型的指针之间转换(上转换和下转换,无需运行时类型检查),在指向枚举的整数类型之间转换。
reinterpret_cast
运算符将任何指针类型转换为另一种,即使它们是不相关的,也可以将整数转换为指针或。
参考:在cplusplus.com 上,static_cast
和reinterpret_cast
的措辞似乎更清晰
- 如果条件不相关,我应该更喜欢两个 if 语句而不是 if-else 语句吗?
- 虚假唤醒是否会解锁所有等待线程,甚至是不相关的线程?
- std::less是否应该允许在编译时比较不相关的指针?
- 提升错误:变量"TimeSpec RQTP"具有初始值设定项,但类型不完整
- 'HMAC_CTX'类型不完整
- 使用wchar_t更改字符的类型不像L
- 0 的 2D 数组 不相关循环的破坏逻辑 - C++
- 将积分类型的数组作为另一个不相关的积分类型的阵列进行访问的安全且符合标准的方法
- 强制转换为不相关的引用类型是否违反严格的别名规则?
- 对类型 'A *' 的非常量左值引用不能绑定到不相关的类型 'std::shared_ptr<A>' 的值
- 将不相关类型的对象reinterpret_cast空类是未定义的行为吗?
- C++中的类型转换:相关类型和不相关类型
- 与两个(看似)不相关的类型匹配的模板
- 当将不相关类型定义为别名时,对函数的调用是不明确的
- 对类型 '_wrap_iter<pointer>' 的非常量左值引用无法绑定到不相关类型的值
- interpret_cast和virtual在不相关的类型之间
- MISRA C++ 2008 违反规则 5-2-7:不得直接或间接将指针类型的对象转换为不相关的指针类型
- 我应该更喜欢mixin还是函数模板来将行为添加到一组不相关的类型中
- 针对不相关类型的动态调度的解决方案
- 将函数的返回值类型转换为大小相同的不相关类型