为什么我能分配一个函数引用到一个匿名函数指针变量
Why am I able to assign a function reference to an anonymous function pointer variable?
下面的代码编译得很好,我不知道为什么。谁能给我解释一下为什么这是合法的?
我使用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) = ∑
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
)。
相关文章:
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 如何仅为一个函数添加延迟
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 我需要将多个函数组合为一个函数
- 在C++中声明一个函数时,它需要有函数本身的参数吗
- 如何创建一个函数来计算并返回平均值、最大值和最小值
- 一个函数,用于查找字符串1包含字符串2 c++的次数
- 如何将一个类的函数作为另一个类的另一个函数的参数传递
- 编写一个函数以使用 n 百分比的 CPU 使用率
- 将 N-arg 函数包装到另一个函数中
- 如何封装一个函数,以便它只能由同一类中的一个其他函数调用?
- C++(.cpp文件和.h文件)拆分代码并添加一个函数,提取 - 这很容易吗?
- C++从另一个函数退出函数
- 编写一个函数来删除单链表中的节点(尾部除外),仅授予对该节点的访问权限
- 视觉我希望一个函数在另一个函数C++中进行计算
- C ++如何在原始抽象类中创建一个函数,该函数接受派生类的输入
- 在另一个函数 (c++) 中调用变量
- 如何在另一个函数中使用返回值作为参数?
- 如何包装一个函数以适应另一个函数的所需类型
- 创建一个函数的 Python 绑定,返回指向带有 boost 的向量的指针