C++ 为什么会有函数到布尔的隐式转换?

C++ 为什么会有函数到布尔的隐式转换?,c++,function,return,boolean,implicit-conversion,C++,Function,Return,Boolean,Implicit Conversion,我试图在我的代码中找到一个bug,发现返回的函数名被隐式转换为bool为true: bool isArabicNumeral(char arg) { /* Details not important*/ }; bool isValidVarNameFirstChar(char arg) { /* Details not important */ } bool isValidVarNameContinuationChar(char arg) { return isValidVarNameF

我试图在我的代码中找到一个bug,发现返回的函数名被隐式转换为bool为true:

bool isArabicNumeral(char arg) { /* Details not important*/ };
bool isValidVarNameFirstChar(char arg) { /* Details not important */ }
bool isValidVarNameContinuationChar(char arg)
{
    return isValidVarNameFirstChar || isArabicNumeral(arg) ? true : false;
    // I forgot to write the brackets after isValidVarNameFirstChar 
    // so the function wasn't called. This always returns true.
}
<> P>所以我发现C++允许转换到BoL,无论它在哪里发生这样的转换都是有用的,所以我可以这样做:

void afunction() {};

int main()
{
    bool boolVariable = afunction; // This works
    int intVariable = afunction; // This doesn't work

    return 0;
}
我的问题是,我知道从函数到bool有一个隐式转换,但为什么它总是返回真的呢。还有,到底是什么被转换成布尔?它是函数指针,因此它实际上返回类似于0xF7B3A1D0的内容,并将其转换为true,因为任何非零值都是true?还是返回函数类型名?还是别的什么?这很奇怪,通常当我不小心在一个函数后面留下括号时,我的编译器通常会说一些类似于函数调用的非标准用法

此外,这是一个如何有用的转换

它是函数指针,因此它实际上返回类似于0xF7B3A1D0的内容,并将其转换为true,因为任何非零值都是true


是的。

是的,布尔检查的原因只是看它是否为假,即0,如果它不是假,那么它是真的。

这与有用无关。这只是一般语言规则的一个派生。这是一个如何有用的转换?在这种情况下,这不是真的,但在一般情况下,它是有意义的。特别是在较旧的代码中,如果某个指针执行非空检查,则执行该操作是很常见的。这对于函数指针和对象指针同样有效。当给定一个命名函数时,在语言中设置一个特例来禁止这种转换,这无疑是一种膨胀。很简单,没有理由禁止它。这类似于if 1。更准确地说,这是一个零度测试,而不是与零的比较。仅仅因为可以使用文字零来创建空指针常量并不意味着null和零是相同的。false aka null是不正确的,因为false实际上不是空指针constant@Ben好了,我明白了,它正在检查它是否为零,对吗?不确定空指针常量是什么意思。@斑马鱼:不,它检查指针是否为空指针。可以将空指针写为0,但空指针和零不相同。只有文字0是空指针,而计算结果为零的算术则不是。