如何调用返回函数指针的函数?



我正在尝试使用显式取消引用调用函数指针。但是编译器抛出一个错误:

no operator "*" matches these operands.

这是我代码的简化版本:

#include <functional>
#include <iostream>
int add(int a, int b)
{
return a + b;
}
std::function<int(int, int)> passFunction()
{
return &add;
}
int main()
{
int a{ 1 };
int b{ 2 };
std::cout << (*passFunction())(a, b);
return 0;
}

问题是,当我只是写时它工作正常:

std::cout << passFunction()(a, b); // without asterix. 

这让我大吃一惊。

我想,我在函数调用中搞砸了括号。我尝试了不同的顺序和优先级,我用 & 符号调用它,但编译器甚至没有退缩。

我正在尝试使用显式取消引用调用指针函数。但是编译器抛出了一个error: 'no operator "*" matches these operands'.

类型很重要!

passFunction的返回类型不是指针,而是std::function。这不是可参考的东西。因此,您会收到编译器错误。


问题是,当我只是写时它工作正常:没有星号的std::cout << passFunction()(a, b);[...]

std::function用于调用/调用。这就是passFunction()(a, b)工作的原因。它调用std::functionoperator()(即等效于passFunction().operator()(a, b))。

话虽如此,如果你只是按auto返回函数(因为 C++14 - 让编译器推断类型),你将得到实际的函数指针,你可以调用 通过取消引用(不必要的)或直接。

using fun_t = int(*)(int, int); // function pointer type
auto passFunction()
//^^^ use auto --> type ==  int(*)(int, int)
// or use fun_t
{
return &add;
}

现在你可以(不必要的)

(*passFunction())(a, b);

passFunction()(a, b);

现在明显的问题是,"这两种语法如何可能?在以下帖子中详细阅读此处:

  • 函数指针的取消引用是如何发生的?
  • 通过函数指针调用函数 - 是否取消引用指针?有什么区别?
  • 为什么我们可以取消引用函数指针?

但编译器抛出错误:"没有运算符"*"与这些操作数匹配"。

您的passFunction返回一个std::function<int(int, int)>正如我们从其文档中看到的那样,该没有任何重载的取消引用运算符。因此我们不能写*passFunction().正确的语法如下所示:

//------------v----------------------->removed the * as std::function does not overload any such operator
std::cout << ( passFunction())(a, b)

//----------v------------------------>no need for dereferencing
std::cout << passFunction()(a, b);

不应在passFunction()返回的std::function<int(int, int)>上使用*运算符,因为它不会返回需要取消引用的指针。

这个简单的例子可以:

#include <functional>
#include <iostream>
int add(int a, int b) {
return a + b;
}
std::function<int(int, int)> passFunction() {
return add; // or return &add - same thing when it comes to free functions
// as opposed to member functions
}
int main() {
int a{1};
int b{2};
std::cout << passFunction()(a, b);
}

我认为混淆来自这样一个事实,即您&add返回函数指针 - 但看看什么是重要的: 返回类型:

std::function<int(int, int)>

这就是passFunction()返回的内容。这不是一个指针。它按值返回它。你return的函数指针只是用作std::function<int(int, int)>构造函数的参数。

相关内容

  • 没有找到相关文章

最新更新