【发布时间】: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