gpt4 book ai didi

C++ -- 关于函数指针的问题

转载 作者:可可西里 更新时间:2023-11-01 17:39:46 25 4
gpt4 key购买 nike

我写了下面的代码:

#include "stdafx.h"
#include <iostream>
using namespace std;

double funcA()
{
return 100.0;
}

int g(double (*pf)())
{
cout << (*pf)() << endl;
return 0;
}

int g2(double pf())
{
cout << pf() << endl;
return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
g(&funcA); // case I
g(funcA); // case II

g2(funcA); // case III
g2(&funcA); // case IV
return 0;
}

我在 VS2008 上运行了上面的代码,每个函数调用都返回“100”。这是问题:

Q1>代码有问题吗?

Q2> C++ 似乎没有区分*pf 和pf。对吗?

谢谢

最佳答案

C++ 确实,实际上,对类型double()double(*)()做了区分,但是区别是微妙的。当您将函数类型作为参数传递给函数时,函数类型会自动“降级”为函数指针。 (我想这类似于数组类型在作为函数参数传递时如何退化为指针类型。)

但是,根据 C++ 类型系统,函数类型和函数指针类型仍然是不同类型。考虑以下情况:

void g() { }

template <class F>
struct Foo
{
Foo(const F& f) : func(f)
{ }

void operator()() { func(); }

F func;
};


int main ()
{
Foo<void()> f(g);
f();
}

这应该无法编译,因为您不能将函数类型声明为自动变量。 (请记住,函数不是 C++ 中的一流对象。)所以声明 F func; 是无效的。但是,如果我们将 main 函数更改为使用函数 pointer 来实例化模板,如下所示:

int main ()
{
typedef void(*function_pointer)();
Foo<function_pointer> f(g);
f();
}

...现在可以编译了。

关于C++ -- 关于函数指针的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4206660/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com