取消引用函数指针的值意味着什么
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首先它恢复为常规指针).
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::boolalpha
的 true
)。如果你想在 func
上打电话,你可以 func(42)
(或 (*func)(42)
)。
#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首先它恢复为常规指针).
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::boolalpha
的 true
)。如果你想在 func
上打电话,你可以 func(42)
(或 (*func)(42)
)。