综上所述,将函数指针或指针转换为指针是完全可以的int
to a void*
也bool
.
引用指出,一个指向object可以转换为cv void *
。函数不是对象,这使得转换不合格cv void *
,仅留下bool
.
然而,如果可以选择两者,指针应该转换为哪一个呢?
它应该转换为const void *
over bool
。为什么?好吧,准备好从过载决议(§13.3 [over.match]/2)开始的旅程。当然,强调我的。
但是,一旦确定了候选函数和参数列表,最佳函数的选择在所有情况下都是相同的:
— 首先,候选函数的子集(具有适当数量的参数并满足
选择某些其他条件来形成一组可行的功能(13.3.2)。
— 然后选择最佳可行函数基于隐式转换序列 (13.3.3.1)需要将每个参数与每个可行函数的相应参数相匹配。
那么这些隐式转换序列又如何呢?
让我们跳到§13.3.3.1 [over.best.ics]/3 看看隐式转换序列是什么:
格式良好的隐式转换序列是以下形式之一:
— 标准转换序列(13.3.3.1.1),
— 用户定义的转换序列(13.3.3.1.2),或
— 省略号转换序列(13.3.3.1.3)。
我们对标准转换序列感兴趣。让我们跳到标准转换序列(§13.3.3.1.1 [over.ics.scs]):
1 表 12 总结了第 4 条中定义的转换,并将它们分为四个不相交的类别:左值转换、资格调整、升级和转换。 [注意:这些类别相对于值类别、cv 限定和数据表示是正交的:左值变换不会更改类型的 cv 限定或数据表示;资格调整不会改变类型的值类别或数据表示;并且促销和转换不会更改类型的价值类别或简历资格。 ——尾注]
2 [ 注意:如第 4 条所述,标准转换序列要么是 Identity 转换本身(即无转换),要么由来自其他四个类别的一到三个转换组成。
重要的部分在/2 中。标准转换序列允许是单个标准转换。这些标准转换列于表 12 中,如下所示。请注意,您的指针转换和布尔转换都在那里。
从这里,我们学到了一些重要的东西:指针转换和布尔转换具有相同的等级。请记住,当我们转向隐式转换序列排名时(§13.3.3.2 [over.ics.rank])。
查看 /4,我们看到:
标准转换序列按其等级排序:精确匹配是比促销更好的转换,促销是比转换更好的转换。除非满足以下规则之一,否则具有相同秩的两个转换序列是无法区分的:
— 不将指针、指向成员的指针或 std::nullptr_t 转换为 bool 的转换是
比这样做的更好。
我们以非常明确的声明的形式找到了答案。万岁!