为什么" bool的地址总是评估为真或#34;这里?

时间:2014-12-22 23:44:51

标签: c++ function-pointers

我试图理解函数指针是如何工作的。这代表设置:

bool f1(int x){
    if(condition){return true;}
    else return false;
}

bool f2(int x, bool (*func)(int)){
    if (func(x)){return true;}
    else return false;
}

void f3(int x, bool (*func)(int, bool)){
    if (func(x, f1)) {return "Whatever";}
    else return "Nevermind";

int main(){
    f3(x, f2);
}

这给了我:
在功能' void f3()':
"警告:布尔的地址' f1(int)'将始终评估为' true' [-Waddress]
在功能' int main()':
错误:来自' bool()的无效转换(int,bool()(int))' to' bool(*)(int,bool)'

我搞砸了多少?

2 个答案:

答案 0 :(得分:1)

如果直接从函数的地址生成函数指针,函数指针将始终为非null,并且只有空指针将计算为false

func的第二个参数需要是bool,但您传递的是函数的名称。该函数自动转换为指向函数的指针,然后使用上述规则自动转换为bool

答案 1 :(得分:1)

void f3(int x, bool (*func)(int, bool)){
                                 ^^^^

f3的第二个参数是指向第二个参数为bool的函数的指针。

f2是您要传递给f3的函数类型,并且来自f3,但f2的第二个参数的类型为bool (*)(int)

因此应该声明f3

void f3(int x, bool (*func)(int, bool (*)(int)))

注意:通过恰当地使用typedef可以使这更具可读性:

typedef bool f1_t(int);
typedef bool f2_t(int, f1_t*);

bool f1(int x) { ... }
bool f2(int x, f1_t* func) { ... }
void f3(int x, f2_t* func) { ... }