C++中的类型转换:相关类型和不相关类型

Type conversion in C++: related and unrelated types

本文关键字:类型 不相关 类型转换 C++      更新时间:2023-10-16

我正在阅读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_castreinterpret_cast的措辞似乎更清晰