【问题标题】:Why is there Implicit conversion of function to bool?为什么有函数到布尔的隐式转换?
【发布时间】:2018-02-11 16:58:40
【问题描述】:

我试图在我的代码中找到一个错误,发现返回的函数名被隐式转换为布尔值:

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.
}

所以我发现 C++ 允许转换为 bool,只要它对发生这种转换有用,所以我可以这样做:

void afunction() {};

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

    return 0;
}

我的问题是,我知道从函数到布尔的隐式转换,但为什么它总是返回 true。另外,什么实际上被转换为布尔值?它是函数指针吗,所以它实际上返回了 0xF7B3A1D0 之类的东西,并转换为真,因为任何非零都是真的?还是返回函数类型名?或者是其他东西?这很奇怪,通常当我不小心在函数后面留下括号时,我的编译器通常会说“非标准使用函数调用”。

另外,这是一个有用的转换吗?

【问题讨论】:

  • 这不是有用的。它只是一般语言规则的派生词。
  • "这是一个有用的转换" -- 在这种情况下不是真的,但在一般情况下它是有意义的。执行if (somePointer) 来执行非空检查是司空见惯的(尤其是在旧代码中)。这对函数指针和对象指针一样有效。当给定一个命名函数时,在语言中放置一个特殊情况来禁止这种转换可以说是臃肿。很简单,没有理由禁止它。类似于if (1)

标签: c++ function return boolean implicit-conversion


【解决方案1】:

它是函数指针吗,所以它实际上返回了 0xF7B3A1D0 之类的东西,并转换为真,因为任何非零都是真的?

是的。

【讨论】:

  • 更准确地说,它是一个空性测试,而不是与 zero 比较。仅仅因为可以使用文字 zeros 来创建空指针常量,并不意味着 null 和 zero 是相同的。
【解决方案2】:

是的,布尔检查的原因只是看它是否为假(也称为 0),如果它不是假的,那么它就是真的。

【讨论】:

  • "false aka null" 不正确,因为false 实际上不是空指针常量
  • @Ben Voigt 所以我明白这一点,它正在检查它是否为零,对吗?不知道你所说的空指针常量是什么意思。
  • @Zebrafish:不,它检查指针是否为空指针。可以将空指针写成0,但空指针和零是不一样的。只有文字 0 是空指针,计算结果为零的算术不是。
猜你喜欢
  • 2011-02-26
  • 2021-04-22
  • 1970-01-01
  • 2017-04-11
  • 2015-11-07
  • 1970-01-01
  • 2017-07-05
  • 1970-01-01
  • 2010-11-04
相关资源
最近更新 更多