【发布时间】:2011-07-13 05:58:25
【问题描述】:
例子:
// 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 中引入枚举的前向声明,认识到使用前向声明来减少依赖关系和编译时间的好处,这肯定是同一件事的一部分,不是吗?
【问题讨论】:
-
正如 eric lippert 在回答有关 C# 的这类问题时多次重申的那样,在没有充分理由的情况下不会将内容放入 C# 规范中。即使是看似很小的机会的影响也可能意味着极端情况、编译时间等方面的巨大差异,因此必须证明所加入的每个功能都是合理的,并且收益必须大于成本。而且,我要补充一点,没有“简单”的功能可以实现。 ;)
-
@Zach:不,Eric Lippert 讨论了 C#。但同样的原因也适用于 C++。
-
@Ben:C#?哇,看看谁在说话。该语言中有很多极端情况会导致奇怪和意外的行为。如果这个 Eric 家伙实践他所宣扬的,C# 就不会像现在这样丰富和富有表现力。
-
-1 表示这个问题与其说是一个问题,不如说是表达你的不满,然后当人们试图回答你的问题时变得好斗的跳板。 stackoverflow 不是一个辩论论坛,它是一个寻求帮助和回答问题的地方。
-
@shelley:如果有人告诉你“这不可能”。你不想找出原因吗?