微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

取消引用函数指针的值是什么意思

如何解决取消引用函数指针的值是什么意思

#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 (或 1true 的用法)。如果您想致电std::boolalpha,您可以func(或func(42))。

,

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

当您在 *func 中取消引用传递的 lambda 时,operator<< 没有重载,因此它转换为最接近的可接受结果,即 bool (起初它恢复为一个普通的指针)

documentation

取消引用函数指针会产生标识指向函数的左值

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 举报,一经查实,本站将立刻删除。