取消引用函数指针的值意味着什么

What does the value from dereferencing a function pointer means

#include <iostream>

void PrintTheValue(int(*func)(int a));

int main(int argc, char **argv) {
    PrintTheValue([](int a) {return a; });
    
    return 0;
}

void PrintTheValue(int(*func)(int a)) {
    std::cout << *func << std::endl;
}

在我理解 func 的概念中,它将是一个指向按值传递的 int 的指针。但在这种情况下,我正在传递一个似乎没有在任何地方被调用的 lambda。 (所以根本没有任何价值?)

当我 运行 这样做时,它不会破坏程序,而是打印 00EE6F80.

这个地址是什么意思?我不知道如何解释它。

lambda 是闭包类型 的未命名函数对象。 这种情况的关键部分,这个 class 不会超载 operator<<.

当您取消引用 *func 中传递的 lambda 时,operator<< 没有重载,因此它转换为最接近的可接受结果,即 bool (at首先它恢复为常规指针).

documentation:

Dereferencing a function pointer yields the lvalue identifying the pointed-to function

int f();
int (*p)() = f;  // pointer p is pointing to f
(*p)();          // function f invoked through the function lvalue
// But no sense in *p

它应该打印 1 (因为非空指针),它为我做的 (g++)。该语言确实允许我们这样做,但是 在不调用函数 的情况下取消对函数指针的引用是没有意义的。函数指针的所有特性都归因于它们有一个合理的用法,因此您对它们所做的任何事情都将支持该用法 - @Pete Becker

有关函数​​指针的更多信息,请查看 here,它会有所帮助。

In my concept of understanding the func, it would be a pointer to an int passed by value.

func 是指向函数的指针,它接受 int 和 returns int.

But in this case I'm passing a lambda which doesn't seem to be called anywhere.

您在不捕获的情况下传递 lambda,这可能会隐式转换为指向函数的指针。在PrintTheValue*func中,即对指针的解引用导致对函数的引用,为了传递给operator<< of std::cout,它再次转换为函数指针,然后转换为bool 的值为 true(作为非空指针),那么你应该得到结果 1(或使用 std::boolalphatrue)。如果你想在 func 上打电话,你可以 func(42)(或 (*func)(42))。