Onvolledig type in geneste naamspecificatie

Ik heb als volgt geprobeerd een onvolledig type in de geneste naamspecificatie te gebruiken:

class A;
int b= A::c; // error: incomplete type ‘A’ used in nested name specifier
class A {
    static const int c=5;
};

Er staat niets over in de 3.4.3/1 van N3797 werkconcept:

Er kan naar de naam van een klasse of naamruimtelid of enumerator worden verwezen
naar na de :: scope resolutie-operator (5.1) toegepast op a
geneste-naam-specificatie die de klasse, naamruimte of . aangeeft
opsomming

Dus is de implementatie van dat gedrag afhankelijk?


Antwoord 1, autoriteit 100%

Inleiding

Er zijn verschillende plaatsen in de standaard die impliciet impliceren dat uw code slecht is gevormd, maar het onderstaande citaat spreekt voor zich:

3.3.2p6Aangiftepunt[basic.scope.pdecl]

Na het declaratiepunt van een klasselid, kan de lidnaam worden opgezocht in het bereik van zijn klasse.

Het probleem met je code is niet dat je probeert binnen de body van een onvolledig type te komen, het probleem is dat je alleen kunt verwijzen naar de naam van een klasselid nadatdeze is gedeclareerd.

Aangezien uw voorwaartse verklaring (natuurlijk) geen lid introduceert met de naam c, is het ongepast om naar een dergelijke naam te verwijzen.


De misleidende diagnose…

De diagnose die wordt afgegeven door zowel gccals clangwanneer je code wordt ingevoerd, is enigszins misleidend, en eerlijk gezegd vind ik dat een bugrapport op zijn plaats is.

foo.cpp:3:8: error: incomplete type 'A' named in nested name specifier

We mogeneen onvolledig type een naam geven in een nested-name-specifier, maar zoals gezegd; we mogen niet verwijzen naar een lid dat nog niet is aangegeven.

slecht gevormd:

class X {
  static int a[X::x];        // ill-formed, `X::x` has not yet been declared
  static int const x = 123;
};

legaal:

class X {
  int const x = 123;
  int a[X::x]; // legal, `X` is incomplete (since we are still defining it)
               //        but we can still refer to a _declared_ member of it
};

Other episodes