我正在尝试使用显式取消引用调用函数指针。但是编译器抛出一个错误:
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::function
的operator()
(即等效于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)>
构造函数的参数。