在标准的章节§6.8(N3690草案)中,我看到了这段奇怪的代码:
struct T2 { T2(int){ } };
int a, (*(*b)(T2))(int), c, d;
什么是int(*(*b)(T2))(int)
?!
b
是指向T2
构造函数的指针吗?或者是指向函数指针的指针?
波纹管代码也编译得很好奇怪!:
struct T2 { T2(int){ } };
int((*b)(T2));
答案 0 :(得分:9)
int (*(*b)(T2))(int)
它将b
声明为指针到一个函数:
T2
作为参数int
作为参数int
。应该使用typedef简化此声明:
typedef int (*return_type) (int);
typedef return_type(*function_type) (T2);
或者更好地使用C ++ 11样式类型别名:
using return_type = int(*)(int);
using function_type = return_type(*)(T2);
然后宣言成为:
function_type b; //so simple!
希望有所帮助。
答案 1 :(得分:1)
它是变量b
的声明。 b
是指向函数的指针,其中一个参数类型为T2。此函数的返回类型是指向函数的指针,其中一个参数int返回int。
答案 2 :(得分:0)
这可以帮助您了解这里发生了什么:
struct T2 { T2(int){ } };
typedef int (*func)(int);
int
(*foo(T2))(int) {
}
func
bar(T2) {
}
int main() {
int (*(*b)(T2))(int);
b = &foo;
b = &bar;
return 0;
}
所以这是一个函数,它接受一个T2并返回一个函数指针,该函数指针返回一个返回int并将int作为参数的函数。
我将此添加到我的例子中,为什么c(++)是一种可怕的语言。
顺便说一句,你不能获取构造函数的地址(C ++ 98 Standard 12.1 / 12 Constructors - “12.1-12 Constructors - ”不应该使用构造函数的地址。)