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
}Comeau online在声明'p‘(即接受'main’的地址时)时会出错,而不是在声明‘main’作为朋友时出错。
关于C++03,谁/什么是正确的?
发布于 2010-08-26 04:10:37
“C++03”第3.2/2条规定:
如果对象或未重载函数的名称出现在可能计算的表达式中,则使用
。
它接着列出了使用其他各种类型实体的构成;这是这里重要的一种。
朋友声明不是一种表达。
当函数main()被转换为指针,而该指针被赋值给p时,该表达式是一个表达式,并且它可能被计算(C++03§3.2/2):
表达式可能会被计算,除非它出现在需要积分常量表达式的地方(见5.19),是
sizeof运算符的操作数(5.3.3),或者是typeid运算符的操作数,并且表达式没有指定多态类类型的值(5.2.8)。
发布于 2010-08-26 04:37:43
C++03关于C++和ISO兼容性的附录C.1如下:
3.6的变动
Change:Main不能递归调用,也不能获取其地址
基本原理:主要功能可能需要特殊操作。
对原始特征的影响:删除语义定义良好的特征
转换的困难:平凡:创建一个中间函数,如mymain(argc,argc)。
广泛使用的:很少
发布于 2010-08-26 04:10:38
按照确切的措辞(“way be use ”),我认为第一个示例是合法的,因为它没有以任何方式使用该函数。它在某个地方添加了某种引用,并允许函数访问私有数据。它不使用main(),它提供了对它的更多访问。
第二个示例(以地址为例)实际上使用main()作为符号,方法是获取它的地址并将其放入指向函数的指针中。这不仅允许您轻松地打破不从程序中调用main的规则,它还必须与其交互(至少告诉main在哪里的信息)。
https://stackoverflow.com/questions/3571959
复制相似问题