通过 "pass by value" 将一个函数传递给另一个函数

Passing a function to another function via "pass by value"

代码

void printA()
{
   cout << "A\n";
}

void print1( void (*func_ptr)(void) )
{
   func_ptr();
}

void print2( void func(void))
{
   func();
}

int main()
{
  //Method 1a (passing function pointer)
  print1(&printA);
  //Method 1b (why does it work even though I didn't pass a reference or a pointer?)
  print1(printA);

  //Method 2 (passing the whole function ?)
  print2(printA);

  return 0;
}

方法 1a 有意义:print1 需要引用或指针。
问题 1:
方法 1b 没有意义:为什么编译器不抛出错误。为什么它可以工作,即使我没有将 printA() 的引用或指针传递给 print1()?
问题 2:
方法 2a 意味着创建函数 printA() 的新副本并将其传递给函数 print2()。 也就是说,函数printA()是按值传递给函数print2()的吗?
问题 3:
函数的标识符是引用吗? (这可能有帮助)
非常感谢。

本函数声明的参数

void print2( void func(void));

被编译器调整为指向

的函数类型的指针
void print2( void ( *func )(void));

以上两个声明都声明了同一个函数,并且可能都出现在同一个编译单元中,尽管编译器会发出一条消息,指出存在冗余函数声明。

另一方面,用作上述函数参数的函数指示符被隐式转换为指向该函数的指针。

你甚至可以这样写

print2(**********printA);

所以你这个问题

Method 2a implies a new copy of the function printA() is made and passed to function print2(). In other words, is the function printA() is passed to function print2() by value?

那么函数的两个副本都不会被传递。它是指向传递的函数的指针。