为什么不允许嵌套类的前向声明

Reason for not allowing forward declarations of nested class?

本文关键字:声明 不允许 嵌套 为什么      更新时间:2023-10-16

示例:

// can't forward declare with class Foo::Bar
// actual class
class Foo
{
public:
    class Bar // or enum Bar
    {
    }
};

我承认在当前的C++标准下这是不允许的,但我找不出不允许的好理由,尤其是在C++0x中,我们现在可以转发声明枚举了。我想,反对它的论点是,如果我们直接声明嵌套类,结果证明它是私有的,它是不允许的。但这与在命名空间中正向声明一个类,然后将其声明为外部类的嵌套类没有太大区别。编译器只会给出一个错误(可能上一行声明中的错误消息与此声明不匹配(。

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

换句话说(詹姆斯·麦克奈利斯(,"为什么在没有提供Foo或Bar的定义的情况下,类Foo::Bar是不允许的?">

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

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

不正向声明枚举(enum x;(的参数只是编译器在看到有多少值之前无法为枚举变量选择正确的大小。通过允许决定编译器(enum x : int;(,解决了此问题。在进入标准之前,这一点也得到了实施,并被证明是正确的。

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

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

class Foo
{
public:
    class Bar;
};
class Foo::Bar
{
};

如何转发声明嵌套类?为了做到这一点,您必须声明嵌套在其中的类

class ClassName {

您已经开始了一个完整的类声明。不能部分声明类;要么全在这里,要么一个都不在。那么,如果必须完全声明外部类,那么向前声明内部类有什么好处呢?

只有原因是枚举器的大小是由其枚举器决定的。这就是为什么你必须给它们一个明确的大小来转发声明它们。