这是正确的C ++ 0x代码吗?

时间:2011-09-28 12:48:12

标签: c++ lambda c++11

在GCC 4.6中尝试过它并编译和链接,但在MacOS上运行时会出现“总线错误”消息。 VS2010甚至没有编译它。

但问题是,这应该在标准C ++ 0x中实际工作吗?

#include <cstdio>
int (*main)()=[]()->int{printf("HEY!\n");return 0;};

是的,它要做的是将“main”定义为lambda函数。

4 个答案:

答案 0 :(得分:14)

这不是一个有效的C ++程序,因为符号main未定义为函数,而是指向函数的指针。这就是你得到分段错误的原因 - 运行时试图执行指针。

答案 1 :(得分:3)

不,这不正确。

Main是一个特殊的函数,对它有严格的要求(甚至比常规函数更严格),但是你也在函数是什么和函数指针之间混淆。

逻辑问题是函数和保存指向函数的指针的变量之间存在差异(你想要的是什么)。 函数在内存中有一个固定的地址,因此调用一个简单调用地址的函数。指向函数的指针指向内存中的地址,因此要先调用所需的函数来读取指针所指向的函数,然后调用该地址。

指向函数的指针与函数具有不同的间接级别。

语法是相同的...即,如果x是指向函数的指针,则可以编写x(42),但如果x而不是生成的机器代码,则生成的机器代码仍然不同函数(在指针的情况下,必须查找一个值,并在运行时确定调用地址,函数地址是固定的 - 直到重定位 - 并在链接时确定。)

答案 2 :(得分:0)

为了编译器和标准库实现之间的可移植性,当#including <cstdio>时,printf()必须是std :: printf()。以及关于无效main()的其他内容。

答案 3 :(得分:0)

现在,它甚至不应该编译。 lambda表达式产生一个类型(仿函数)。 没有从类型到函数指针的隐式转换。

根据编译器,main函数可以具有C ++或C链接(它是实现定义的)。 Lambda表达式返回带有函数调用运算符的C ++类型,因此C ++链接。