$ 3.6.1/3州 -
"函数main不得 在程序中使用(3.2)."
下面以学术为动机的示例程序使用了我认为合法的几种方式的名称"main".这是基于"函数的使用"与调用函数(直接/间接)相关的假设.
struct MyClass{
private:
MyClass(){}
friend int main();
};
int main(){
MyClass m;
int (*p)() = main; // but don't do anything
}
Run Code Online (Sandbox Code Playgroud)
很公平,显示的代码用gcc/VS 2010编译.
我很惊讶Comeau的错误.
Comeau online在声明'p'时(即在获取'main'的地址时)给出错误,但在声明'main'为朋友时却没有.
谁/什么是关于C++ 03的权利?
C++03§3.2/ 2说:
如果对象或非重载函数的名称出现在可能已评估的表达式中,则使用该函数.
它接着列举什么是使用其他各类实体的; 这是重要的一个.
朋友声明不是表达.
当函数main()转换为指针并指定指针时p,这是一个表达式并且可能被评估(C++03§3.2/ 2):
表达式可能被评估,除非它出现在需要整数常量表达式的地方(见5.19),是运算
sizeof符的操作数(5.3.3),或者是运算typeid符的操作数,表达式没有指定多态类的左值类型(5.2.8).