出于教育原因,我正在使用 clang-12 std=c++17 学习 C++ 语言
我有以下代码:
完整代码
#include <cstdio>
#include <iostream>
#include <type_traits>
using namespace std;
struct S {
void operator()(int) {}
};
int main()
{
S(*d)(int);
//d = whatValue??
return 0;
}
我在研究C++语言中存在的变量类型,遇到了上面这种情况。
我可以为 <b>d</b>
分配什么值?变量?
会不会是语言错误?我已经研究了几个关于 stackoverflow 和 cppreference 的主题,但还没有找到任何方法来初始化这个变量 S(*d)(int)
.
最佳答案
变量d
是一个指向接受 int
的函数的指针作为参数并返回 S
.请注意,它不能指向非 static
成员函数。例如,您可以像这样使用它:
struct S {
void operator()(int) {}
};
S f(int) { return S(); }
int main()
{
S(*d)(int) = &f;
S rc = d(17);
}
随着函数退化为指针类型,您实际上可以保留 &
出去。对于非 static
情况并非如此不过,成员函数。如果你想获得一个指向 S
的成员函数的指针服用int
作为参数并返回 void
(你的 operator()
返回 void
而不是 S
)你需要使用 &
:
int main() {
void (S::*d)(int) = &S::operator();
S obj;
S rc = (obj.*d)(17); // use d
}
指向成员函数的指针与指向函数的指针不同,因为它们有一个隐含的第一个参数:this
指针。在 C++ 中,很少有函数指针被用于接口(interface) C 代码之外的其他原因:使用 std::function<void(int)>
更灵活,尽管也是类型删除并且很可能涉及 virtual
函数调用并且不可内联。如果函数可以是函数模板,则通常传递 std::invoke()
的函数对象。 ed(而不是直接调用)支持函数指针、指向成员函数的指针、指向非函数成员的指针、lambda、函数等。
关于c++ - 我如何使用 S(*)(int)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70551870/