我知道main
可以是class
的朋友:
#include <iostream>
class foo {
friend int main();
int i = 4;
};
int main() {
foo obj;
std::cout << obj.i << std::endl;
}
然而,我觉得虽然这是完全允许的,但它隐藏了许多危险。
main
成为班上的朋友有什么有用的用途吗?main
作为班级的朋友应被视为有害? 答案 0 :(得分:16)
如果该功能实际上不合法,那么选择是使用还是避免使用合法功能就没有实际意义。我相信对此存在严重怀疑,因为标准说明了
函数
main
不得在程序中使用。
关于是否允许交友::main()
已经存在问题,您可以在my answer there找到更多详细信息。
答案 1 :(得分:8)
一般性的考虑应该与其他任何功能相同。
但是我发现了一个可能的危险:
C ++标准:
首先在朋友声明中声明的函数具有外部链接
main的链接是实现定义的
因此,如果您的实现期望main()
没有外部链接和,那么您首先将main()
声明为朋友(如您的示例中所示),则会违反标准。< / p>
答案 2 :(得分:4)
Ben已经表示3.6.1
主要功能部分中的C ++标准草案说:
函数main不得在程序中使用。 [...]
但使用一词未定义,因此不清楚解释应该是什么。对我们来说幸运的是,我们可以在SO之外找到两条证据,强烈表明main
的所有使用都是格式错误。
首先,我们在帖子undefined behaviour study group discussion list的What does "The function main shall not be used within a program" mean?中进行了此讨论,来自here的引用似乎总结了这种观点:
C ++ 98提到'use'有一个交叉引用3.2 [basic.def.odr]。 C ++ 11不再具有交叉引用,并且未更改为说 'odr-use',所以我希望它意味着任何使用。
我们还有original proposal: N3154要求修正Defect report 1109的更多证据3.6.1
已更改为:{/ p>
函数main不应在程序中使用odr-used(3.2)。 ......
但在accepted时进行了修改,我们可以看到新proposal: N3214已改为我们今天所拥有的内容:
函数main不得在程序中使用