-3

main 函数可以成为 C++ 中的友元函数吗?

 #include "stdafx.h"
#include <iostream>
using namespace std;
class A {
public:
    A():i(10){}
private:
    int i;
    friend int main();
};

int main()
{
    A obj;
    cout<<obj.i;
    return 0;
}
4

2 回答 2

5

标准的 3.6.1(措辞来自草案 n3936,但在 C++03 中是一样的)说:

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

这条规则的确切含义尚不清楚。该标准正式定义了相关术语odr-used的语义,但不只是used

为了安全起见,假设这条规则意味着“函数main不得在friend声明中命名”。


有趣的是,虽然这条规则的措辞与 C++03 相同,但在那个版本中,我们现在所知道的odr-used还没有被重命名,这条规则显然是指这个概念。我想知道在从used重命名为odr-used的过程中是否忽略了这一点。如果此处有意不使用新术语,那么该决定的基本原理可能会阐明哪些用途,确切地说,是打算被禁止的。


Shafik 发现重命名发生在 N3214 中,并且故意不将这条规则更改为odr-use,尽管它没有解释原因。

于 2014-08-01T01:03:15.620 回答
4

main 函数可以成为 C++ 中的友元函数吗?

是的,它可以。

friend您的类中的声明A授予函数main()访问其非公共数据成员名称的权利(在本例中为i):

friend int main();

该对象obj是默认构造的,并且A的构造函数将 的值设置i10

A() : i(10) {}
//  ^^^^^^^
//  Initializes i to 10 during construction

然后,将该值obj.i插入到标准输出中:

cout << obj.i;
//      ^^^^^
//      Would result in a compiler error without the friend declaration
于 2013-06-11T16:14:51.767 回答