宣称主要是朋友认为有害吗?

时间:2014-07-31 22:33:43

标签: c++ c++11 main language-lawyer friend

讨论

我知道main可以是class的朋友:

#include <iostream>

class foo {
  friend int main();
  int i = 4;
};

int main() {
  foo obj;
  std::cout << obj.i << std::endl;
}

LIVE DEMO

然而,我觉得虽然这是完全允许的,但它隐藏了许多危险。

问题

  1. main成为班上的朋友有什么有用的用途吗?
  2. 是否有任何理由宣称main作为班级的朋友应被视为有害?

3 个答案:

答案 0 :(得分:16)

如果该功能实际上不合法,那么选择是使用还是避免使用合法功能就没有实际意义。我相信对此存在严重怀疑,因为标准说明了

  

函数main不得在程序中使用。

关于是否允许交友::main()已经存在问题,您可以在my answer there找到更多详细信息。

答案 1 :(得分:8)

一般性的考虑应该与其他任何功能相同。


但是我发现了一个可能的危险:

C ++标准:

  • 第11.3节(朋友)
  

首先在朋友声明中声明的函数具有外部链接

  • 第3.6.1节(主要功能)
  

main的链接是实现定义的

因此,如果您的实现期望main()没有外部链接,那么您首先将main()声明为朋友(如您的示例中所示),则会违反标准。< / p>

答案 2 :(得分:4)

Ben已经表示3.6.1 主要功能部分中的C ++标准草案说:

  

函数main不得在程序中使用。 [...]

使用一词未定义,因此不清楚解释应该是什么。对我们来说幸运的是,我们可以在SO之外找到两条证据,强烈表明main的所有使用都是格式错误。

首先,我们在帖子undefined behaviour study group discussion listWhat 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不得在程序中使用