不允许嵌套类的前向声明的原因?

时间:2011-07-13 05:58:25

标签: c++ standards

示例:

// can't forward declare with class Foo::Bar

// actual class
class Foo
{
public:
    class Bar // or enum Bar
    {
    }
};

我接受在当前的C ++标准下不允许这样做,但我无法想出不允许它的理由,特别是对于C ++ 0x,我们现在能够转发声明枚举。我想象一个反对它的论据是,如果我们向前声明嵌套类,结果证明它是私有的,那就不允许了。但是,如果在声明命名空间中声明一个类,然后将其声明为外部类的嵌套类,那就不会有太大的不同了。编译器只会给出一个错误(可能是在前一个声明的行上的错误消息与此声明不匹配)。

那么为什么它真的不被允许呢?

换句话说(由James McNellis提供),“为什么Foo :: Bar类;不提供Foo或Bar的定义?”

**鉴于C ++标准委员会认识到使用前向声明通过在C ++ 0x中引入枚举的前向声明来减少依赖性和编译时间的好处,肯定这是同一件事的一部分不是吗? / p>

3 个答案:

答案 0 :(得分:9)

它不在语言中的原因很简单,没有人提出如何将其包含在语言中的好建议。功能不包括自己,有人必须写出来并解释其优点,并且没有(或非常小的)缺点。

不向前声明枚举(enum x;)的论据只是编译器无法为枚举变量选择合适的大小,直到它看到有多少值。通过允许决定编译器(enum x : int;)来解决此问题。在进入标准之前,这已经实施并显示正常工作。

请参阅http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2764.pdf

答案 1 :(得分:3)

嵌套类肯定可以向前声明:

class Foo
{
public:
    class Bar;
};

class Foo::Bar
{
};

答案 2 :(得分:2)

你怎么能转发声明一个嵌套类?为了做到这一点,你必须声明它嵌套的类。一旦你去了:

class ClassName {

您已开始全班声明。你不能部分宣布一个类;它要么全部在这里,要么都不在这里。那么,如果外部类必须被完全声明,那么向前声明内部类会有什么好处呢?

直到现在,原因枚举无法向前声明,因为它们的大小由其枚举器决定。这就是为什么你必须给它们一个明确的大小来转发声明它们。