为什么我能分配一个函数引用到一个匿名函数指针变量

Why am I able to assign a function reference to an anonymous function pointer variable?

本文关键字:一个 函数 指针 变量 引用 分配 为什么      更新时间:2023-10-16

下面的代码编译得很好,我不知道为什么。谁能给我解释一下为什么这是合法的?

我使用g++ (Debian 6.1.1-10) 6.1.1 20160724编译。

#include <iostream>
int sum(int x, int y) { return x + y; }
int main(int argc, char *argv[])
{
    using std::cout;
    int (*) (int, int) = &sum;
    cout << "what" << 'n';
}

附录

下面的程序在g++ 5.4.0版本中可以正常编译,但在gcc中无法编译。

int main()
{
    int (*) = 20;
}

这很可能与Zack Weinberg报告的错误有关:

Bug 68265 -在'int(*){}'之后,直到下一个右括号

之前,任意语法无意义被静默接受

(从为什么这个看起来无效的代码在g++ 6.0上编译成功?:)

c++编译器无法诊断诸如

这样的错误结构。
  int main()
  {
      int (*) {}
         any amount of syntactic nonsense
         on multiple lines, with *punctuation* and ++operators++ even...
         will be silently discarded
         until the next close brace
  }

使用-pedantic -std=c++98你会得到"warning: extended initializer "列表仅在-std=c++11或-std=gnu++11"时可用,但在-std=c++11, not a peep.

如果任何一个(或多个)令牌'int(*){}'被删除,则执行得到一个错误。此外,C编译器没有相同的错误。

当然,如果您尝试int (*) (int, int) {}或其他变体,它将错误地编译。有趣的是,此报告与之前的重复/错误报告之间的区别在于,int (*) (int, int) = asdf要求asdf是作用域中的名称。但是我非常怀疑这些bug在本质上是不同的,因为核心问题是GCC允许您省略声明符-id

[n4567§7/8]:" init-declarator-list中的每个init-declarator只包含一个声明符id,这是由初始化声明器,因此是由声明。"

这里有一个奇怪的地方:

int (*) (int, int) = main;

在这个特定的场景中,GCC没有抱怨获取main的地址(像数组一样,&main相当于main)。