如何解决取消引用函数指针的值是什么意思
#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
。
这个地址是什么意思?我不知道如何解释它。
解决方法
在我理解 func
的概念中,它将是一个指向按值传递的 int 的指针。
func
是一个指向函数的指针,它接受一个 int
并返回 int
。
但在这种情况下,我传递了一个似乎没有在任何地方被调用的 lambda。
您正在传递一个没有捕获的 lambda,它可以隐式转换为指向函数的指针。在PrintTheValue
,*func
中,即对指针解引用导致对函数的引用,为了传递给operator<<
of std::cout
,它再次转换为函数指针,然后转换为{{1} } 与值 bool
(作为非空指针),那么你应该得到结果 true
(或 1
与 true
的用法)。如果您想致电std::boolalpha
,您可以func
(或func(42)
)。
lambda 是闭包类型的未命名的函数对象。
这种情况的关键部分是,此类不会重载 operator<<
。
当您在 *func
中取消引用传递的 lambda 时,operator<<
没有重载,因此它转换为最接近的可接受结果,即 bool
(起初它恢复为一个普通的指针)。
取消引用函数指针会产生标识指向函数的左值
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,它会有所帮助。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。