C ++ 17是否允许嵌套类的前向声明?

时间:2016-04-20 06:46:21

标签: c++ c++17

不知道在哪里问(如果这是一个不恰当的问题,请随时关闭)但我在C ++ 17提案中没有找到任何相关内容,thisthis提及它在处理嵌套命名空间时加入C ++。

所以目前这是唯一的选择:

class A 
{
public: 
    class B; //forward-declared INSIDE class/namespace
};

class A::B //defined outside
{
};

这可以在C ++ 17中实现吗?

class A::B; //forward declared NESTED outside of parent class/namespace

class C
{
    A::B *b;
};

然后或者这个(1)(似乎是嵌套的namepsace定义的提议)

class A::B //definition of A::B without defining A
{

};

或这(2)

class A
{
public:
    class A::B
    {

    };
};

或[3]

class A
{
public:
    class B;
};

class A::B
{
};

我怀疑A::B的定义没有首先定义A可能不起作用(尽管提案似乎允许)。

1 个答案:

答案 0 :(得分:7)

针对标题为Forward declarations of nested classes P0289R0的问题提出了一项提案。但是正如您在上一篇Trip Report: C++ Standards Meeting in Jacksonville, February 2016中所看到的那样,该提案倾向于鼓励进一步开展工作的提案。我引用了委员会的判决结果(强调我的):

  

这样可以让X::A*之类的内容显示在标题中   要求X的定义也出现在标题中   (XX::A的前向声明就足够了。 EWG找到了   用例引人注目,因为目前有很多类定义   仅出现在标头中,因为标头中定义的接口使用   指针或对类型的嵌套类的引用。 几个细节   还需要解决。 (例如,如果a会发生什么   X的定义没有出现在任何其他翻译单元(TU)中?   如果X的定义出现在另一个TU中,但没有出现,会发生什么   定义嵌套的class A?如果确实定义了嵌套类会发生什么   A,但它是私人的吗?可能必须回答部分或全部这些问题   “形成不良,无需诊断”,因为诊断错误   这种类型需要大量的链接器支持。)