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

Res*_*ion 18 c++ c++17

不知道在哪里问(您可以随时关闭这一点,如果它是一个不恰当的问题),但我还没有具体的C++ 17周的提案发现这样的东西,无论是这个与嵌套命名除了C++打交道时提到它.

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

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

class A::B //defined outside
{
};
Run Code Online (Sandbox Code Playgroud)

这在C++ 17中是否可行?

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

class C
{
    A::B *b;
};
Run Code Online (Sandbox Code Playgroud)

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

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

};
Run Code Online (Sandbox Code Playgroud)

或者这个(2)

class A
{
public:
    class A::B
    {

    };
};
Run Code Online (Sandbox Code Playgroud)

或者这[3]

class A
{
public:
    class B;
};

class A::B
{
};
Run Code Online (Sandbox Code Playgroud)

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

101*_*010 9

关于题为Forward declarations of nested classes P0289R0的问题有一个提案.但是,正如您在2016年2月杰克逊维尔举行的上一次旅行报告:C++标准会议上所看到的那样,该提案倾向于鼓励进一步开展工作的提案.我引用了委员会的判决(Emphasis Mine):

这样就可以X::A*在标题中出现,而不需要定义X也出现在标题中(前向声明X并且X::A足够).EWG发现用例很有吸引力,因为目前很多类定义只出现在头文件中,因为头文件中定义的接口使用指针或对类型嵌套类的引用.仍有一些细节需要解决.(例如,如果定义X没有出现在任何其他翻译单元(TU)中会发生什么?如果定义X出现在另一个TU中,但没有定义嵌套,class A会发生什么?如果它定义了嵌套类A会发生什么? ,但它是私有的?部分或全部的答案可能必须是"格式错误,无需诊断",因为诊断此类错误需要大量的链接器支持.)

  • C++20 怎么样?这至少进入了 C++20 吗? (3认同)
  • 我可能弄错了,但提出的问题似乎得到了回答。即使它最初被采用为更具限制性的版本,它也会有很大的好处,如果结果可以的话,可以在以后的标准中放宽。我认为更大的问题可能是论文中提到的丢失的属性 - 即说 X::A 目前自动也意味着定义,并且(因此)不会引起任何名称查找。不过我觉得这是一个可以接受的价格。希望这一切都能得到解决,并且这个提案会成为最终的 C++17! (2认同)
  • 我不明白他们的担忧,难道你在经典的前向声明中没有遇到完全相同的问题吗?您现在可以转发声明一个不存在的类,或者位于您在转发声明等中未指定的命名空间中。 (2认同)