前几天提出的问题没有说清楚。现在,我将尝试用最简短的语言提出这个问题。 直接看这里的例子,或者直接看我截取的关键片段:
指向非常量类型的指针可以隐式转换为指向相同或兼容类型的 const 限定版本的指针:
int* p = 0;
const int* cp = p; // OK: adds qualifiers (int to const int)
我的观点是这个例子有一点问题。 (我的观点可能不正确。) 接下来详细介绍一下我的理解(同样也可能不正确):
我们首先看一下浮点数到整数的转换,并给出一个完美的例子 (浮点数到整数的隐式转换需要依赖其他隐式转换,因为浮点数不可能出现在任何地方并立即隐式转换为整数。这是荒谬的。
因此,我们可以依靠这样的隐式转换,在简单赋值(=)中,右操作数的值被转换为赋值表达式的类型(C11 6.5.16.1 p2):)
int n=3.14; //double to int
因为这里存在简单赋值需要的隐式转换,所以发生了浮点数到整数的隐式转换。(虽然这是初始化,但根据我所学的知识,我只能认为由于 简单赋值而发生了隐式转换。)
隐式限定转换也是一样。但是需要注意的是,“赋值表达式的类型是左操作数左值转换后的类型。(6.5.16 p3)”同时,这一点在评估作业的约束时已经提到: —左操作数具有原子、限定或非限定指针类型,并且(考虑 左值转换后左操作数的类型)两个操作数都是 指向兼容类型的限定或非限定版本的指针···(6.5.16.1 约束 p1)
那么在第一个示例中,
p
的类型为 int*
,这是正确的。但赋值表达式的类型也应该是int*
而不是const int*
(虚左值转换后),那么为什么第一个例子可以作为隐式限定转换的例子呢?
那么,我的问题是,我上面的分析正确吗?如果正确,请给出一个符合隐式限定转换的完美示例。如有错误,请详细指出。
感谢您阅读它。说实话,我不自信自己是对的。我很乐意您指出我的错误。
我的观点是,这个例子有点问题……但是赋值表达式的类型也应该是
而不是int*
(虚左值转换之后),那为什么可以用第一个例子作为隐式限定转换的示例?const int*
这是不正确的。左值转换会将
const
限定类型(如 const int
)转换为非限定类型(如 int
)。但是,const int *
不是合格类型。它是一个没有任何限定条件的指针;指针不是 const
。指针指向另一种类型。这种类型是const int
。
左值转换不会删除指向类型中的限定符。
int * const
是指向 const
的 int
限定指针,左值转换会将其转换为 int *
。
const int * const
是指向 const
的 const int
限定指针,左值转换会将其转换为 const int *
。
const int *
是指向 const int
的非限定指针,左值转换会将其转换为 const int *
。