为什么函数指针不能被隐式转换?
Why exactly can't function pointers be implicitly converted?
C 的基本原理,修订版 5.10,2003 年 4 月:
It is invalid to convert a pointer to a function of one type to a pointer to a function of a
different type without a cast.
他们似乎想说“没有 显式 转换”。
问题:为什么不允许隐式转换?比较对象:对于整数,允许隐式转换。
更新。同样的问题也适用于对象指针。
有隐式和显式转换。强制转换始终是显式转换并使用 (type)
强制转换运算符。
C 在指针方面具有相当不错的类型安全性。除了空指针转换的特殊情况外,唯一允许的隐式指针转换是在对象指针和指向 void
的指针之间进行的。鉴于没有类型限定符被删除。 void*
不是函数指针的通用类型——不存在这样的类型。根据 C17 6.3.2.3/8,可以在不同的函数指针类型之间进行转换,只要使用正确的类型取消引用指针即可。
在 C17 6.5.16.1 - 简单赋值中找到了允许和不允许的具体规则。满足那里规则的赋值将隐式调用适用的转换规则,它是所谓的“左值转换”,基本上意味着您可以向左操作数添加类型限定符,但不能丢弃右操作数存在的限定符。
一般来说,6.3.2.3说的是一般可以进行什么样的转换,6.5.16.1说的是赋值时允许隐式进行的转换。
允许在各种整数和浮点类型之间进行隐式转换可以说是 C 语言中的一个设计缺陷 - 它是细微且通常是严重错误的持续来源。为什么 C++ 决定通过在所有地方强制执行显式转换来修复它。所以这里真正的问题可能是:为什么 C 允许某些类型的隐式转换?
C 的基本原理,修订版 5.10,2003 年 4 月:
It is invalid to convert a pointer to a function of one type to a pointer to a function of a different type without a cast.
他们似乎想说“没有 显式 转换”。
问题:为什么不允许隐式转换?比较对象:对于整数,允许隐式转换。
更新。同样的问题也适用于对象指针。
有隐式和显式转换。强制转换始终是显式转换并使用 (type)
强制转换运算符。
C 在指针方面具有相当不错的类型安全性。除了空指针转换的特殊情况外,唯一允许的隐式指针转换是在对象指针和指向 void
的指针之间进行的。鉴于没有类型限定符被删除。 void*
不是函数指针的通用类型——不存在这样的类型。根据 C17 6.3.2.3/8,可以在不同的函数指针类型之间进行转换,只要使用正确的类型取消引用指针即可。
在 C17 6.5.16.1 - 简单赋值中找到了允许和不允许的具体规则。满足那里规则的赋值将隐式调用适用的转换规则,它是所谓的“左值转换”,基本上意味着您可以向左操作数添加类型限定符,但不能丢弃右操作数存在的限定符。
一般来说,6.3.2.3说的是一般可以进行什么样的转换,6.5.16.1说的是赋值时允许隐式进行的转换。
允许在各种整数和浮点类型之间进行隐式转换可以说是 C 语言中的一个设计缺陷 - 它是细微且通常是严重错误的持续来源。为什么 C++ 决定通过在所有地方强制执行显式转换来修复它。所以这里真正的问题可能是:为什么 C 允许某些类型的隐式转换?