环境
Dev-C++ 5.11 C++14
使用using创建三种别名
using F=int(int*,int);
using PF=int(*)(int*,int);
using PF2=int*(int*,int);
据推测
F为返回int类型,形参列表为(int*,int)的函数类型
PF为返回int类型,形参列表为(int*,int)的函数指针类型
PF2为返回int*类型,形参列表为(int*,int)的函数类型
定义两个函数
int* bbb(int *a,int b)
{
cout<<"bbb"<<endl;
return a;
}
int aaa(int *a,int b)
{
cout<<"aaa"<<endl;
return *a+b;
}
实验1:
PF pf1(int a)
{
cout<<"pf1"<<endl;
return nullptr;
}
PF pf2(aaa);//PF f1(bbb);
PF pf3(int a);
int main()
{
pf1(10);//output pf1
int a=10;
cout<<pf2(&a,a)<<endl;//output aaa /n 20
pf3(10);//output pf3
}
PF pf3(int a)
{
cout<<"pf3"<<endl;
return nullptr;
}
推测PF为返回int类型,形参列表为(int*,int)的函数指针类型,在pf1作为返回类型,pf1为直接定义,在pf2作为数据类型,表面了pf2是一个函数指针,指向函数aaa,且若指向bbb则报错,在pf3同样作为返回类型,分为声明和定义。
pf1、pf3皆为返回一个[返回int类型,形参列表为(int*,int)的函数指针]的,形参列表为(int)的函数~~(纯纯的套娃)~~
实验2:
PF pf001(int)
{
cout<<"pf001"<<endl;
return nullptr;
}
//PF* pf101(pf001);
//[Error] cannot convert 'int (* (*)(int))(int*, int)' to 'int (**)(int*, int)' in initialization
//PF* pf101(int) = pf001;
//[Error] invalid pure specifier (only '= 0' is allowed) before ';' token
//[Error] function 'int (** pf101(int))(int*, int)' is initialized like a variable
int main()
{
pf001(10);
}
我无法正确的创建一个指向PF返回值,形参列表(int)的函数指针~~(套娃失败)~~,也许需要使用括号获得更正确的结合顺序,总之创建一个指向[返回值为函数指针的函数]的函数指针是一件很不方便的事
实验3:
F f3(int a)
{
cout<<"f3"<<endl;
return aaa;
}
int main()
{
f3(10);//[Error] 'f3' declared as function returning a function
}
试图让f3返回一个函数,报错(错误在f3定义即发生,并没有到执行f3(10)😉
F* f4(int a)
{
cout<<"f4"<<endl;
return aaa;
}
int main()
{
f4(10);
}
手动修改返回值为指针类型,成功
实验4:
int* bbb(int *a,int b)
{
cout<<"bbb"<<endl;
return a;
}
int aaa(int *a,int b)
{
cout<<"aaa"<<endl;
return *a+b;
}
//PF2 pf21(aaa);
//PF2 pf22(bbb);
//[Error] function 'int* pf21(int*, int)' is initialized like a variable
int main()
{
}
pf2和pf22均报错
PF pf0;
PF2 pf20;
decltype(pf0) pf1(aaa);
decltype(pf20) pf21(aaa);//报错
PF不等价PF2
int* bbb(int *a,int b)
{
cout<<"bbb"<<endl;
return a;
}
int aaa(int *a,int b)
{
cout<<"aaa"<<endl;
return *a+b;
}
//PF2* pf22(bbb);
PF2* pf23(int a)
{
cout<<"pf23 "<<a<<endl;
return bbb;
}
int main()
{
pf23(10);//output pf23 10
}
PF2近似F,一个返回[返回值int的函数],一个返回[返回值int*的函数],可以添加一个*号返回函数指针
===============================================================
实在是太绕了,受不了受不了