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;
}
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;
}
标准的 3.6.1(措辞来自草案 n3936,但在 C++03 中是一样的)说:
该函数
main
不得在程序中使用。
这条规则的确切含义尚不清楚。该标准正式定义了相关术语odr-used的语义,但不只是used。
为了安全起见,假设这条规则意味着“函数main
不得在friend
声明中命名”。
有趣的是,虽然这条规则的措辞与 C++03 相同,但在那个版本中,我们现在所知道的odr-used还没有被重命名,这条规则显然是指这个概念。我想知道在从used重命名为odr-used的过程中是否忽略了这一点。如果此处有意不使用新术语,那么该决定的基本原理可能会阐明哪些用途,确切地说,是打算被禁止的。
Shafik 发现重命名发生在 N3214 中,并且故意不将这条规则更改为odr-use,尽管它没有解释原因。
main 函数可以成为 C++ 中的友元函数吗?
是的,它可以。
friend
您的类中的声明A
授予函数main()
访问其非公共数据成员名称的权利(在本例中为i
):
friend int main();
该对象obj
是默认构造的,并且A
的构造函数将 的值设置i
为10
:
A() : i(10) {}
// ^^^^^^^
// Initializes i to 10 during construction
然后,将该值obj.i
插入到标准输出中:
cout << obj.i;
// ^^^^^
// Would result in a compiler error without the friend declaration