【发布时间】:2014-08-16 21:22:41
【问题描述】:
采用这些类定义:
类定义1:
struct A
{
struct B* m_b;
};
类定义2:
struct A
{
struct B;
B* m_b;
};
两个类定义都应将B 声明为嵌套类。至少,通过阅读 C++11 标准草案中的以下内容,我是这么认为的:
9.1/2 类声明将类名引入到声明它的作用域中,并将该名称的任何类、变量、函数或其他声明隐藏在封闭作用域中(3.3)。如果在一个范围内声明了一个类名,其中还声明了一个同名的变量、函数或枚举器,那么当两个声明都在范围内时,只能使用 elaborated-type-specifier 来引用该类 `
但是,g++ 4.8.2 对它们的处理方式不同。在第一个定义中,它将B 视为与A 对等的类。
以下程序构建成功:
struct A
{
struct B* m_b;
};
void myfun(const B& b )
{
}
int main()
{
A a;
myfun(*a.m_b);
}
而以下程序没有:
struct A
{
struct B;
B* m_b;
};
void myfun(const B& b )
{
}
int main()
{
A a;
myfun(*a.m_b);
}
我明白为什么第二个程序没有编译,但我不明白为什么第一个程序编译成功。
我是否在解释标准时遗漏了什么?
g++ 4.8.2 编译第一个程序是否正确?
【问题讨论】: