标准6.8节中的这个例子如何工作?

时间:2014-08-11 13:16:49

标签: c++ function function-pointers

在标准的章节§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));

3 个答案:

答案 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 - ”不应该使用构造函数的地址。)