这是否在最近更新的标准下有效?
auto main = [](int argc, char* argv[]) -> int
{
return 0;
};
我最好的猜测是,它取决于main()必须是一个函数,还是允许它是可调用的任何全局范围符号(()
)。
答案 0 :(得分:14)
不,main
必须是全局函数,不能是函数对象或其他任何东西。参见ISO / IEC 14882:2011§3.6.1主要功能。
程序应包含一个名为main的全局函数,它是程序的指定开始。
来自第2段
所有实现都应允许以下两个定义 主:
int main() { /* ... */ }
和
int main(int argc, char* argv[]) { /* ... */ }
不要求实现允许任何其他定义。
答案 1 :(得分:7)
不,这就是原因:
[n3290: 3.6.1/1]:
程序应包含一个名为的全局函数 main ,这是程序的指定开始。它是 实现 - 定义一个独立环境中的程序 需要定义一个主函数。 [注意:独立式 环境,启动和终止是实现定义的; startup包含对象的构造函数的执行 名称空间范围,具有静态存储持终止包含 为具有静态存储持续时间的对象执行析构函数。 -end note ]
Lambda不是函数,而是函数对象或函子:
[n3290: 5.1.2/3]:
lambda-expression 的类型(这是 也就是闭包对象的类型)是一个唯一的,未命名的不愈合 类类型 - 称为闭包类型 - 其属性如下所述。 [..]
答案 2 :(得分:1)
main()必须是一个函数,因为它是从系统库中调用它的方式。它是POSIX.1标准的一部分,它管理C链接的工作方式
主链接必须是一个外部全局,它不能内联或静态,因为它是从libc中调用的,通常来自一个名为_start的函数。
作为一个例子,glibc中_start的典型实现是:
int _start() {
__libc_init(argc, argv, __environ);
exit(main(argc, argv, __environ));
}
各种libc实现都会以类似的方式实现。
在C ++中,main函数必须在全局范围内声明(即):: main();再次因为它是从类似init的函数调用的,例如_start for libc on * nix函数在执行之后......