scopes, sichtbarkeit, namen und sonderregeln (theoretische frage)



  • hallo,
    ich lese grad nach langer zeit (wieder einmal) den stroustrup in der aktuellsten fassung und probiere so nebenbei ein paar dinge aus, die eher theoretischer natur sind. dabei bin ich auf folgendes beispiel gestoßen, und ich weiß nicht, ob und warum es funktionieren (kompilieren) sollte oder nicht:

    class klass { 
        public:
          klass (class klass (*klass) (class klass))
              :klass(klass){} 
    
          klass (*klass) (klass); 
    
    } klass { nullptr };
    

    vor allem im verhältnis dazu (clang schluckt es mir problemlos):

    class klass { 
        public:
           klass (*klass) (klass); 
    
    } klass { nullptr };
    

    ohne funktionszeiger (nur zeiger auf class klass) erhalte ich wiederum andere fehlermeldungen. könnte jemand erläutern, was hier standardkonformes verhalten ist?


  • Mod

    dove schrieb:

    class klass { 
        public:
          klass (class klass (*klass) (class klass))
              :klass(klass){} 
        
          klass (*klass) (klass); 
        
        
    } klass { nullptr };
    

    An dem Konstruktor ist nichts auszusetzen; wenn ein Konstruktor deklariert wird, dürfen allerdings nicht-statische Member nicht den gleichen Namen wie die Klasse haben.

    dove schrieb:

    class klass { 
        public:
           klass (*klass) (klass); 
       
    } klass { nullptr };
    

    Die Definition des Zeigers klass darf so nicht erfolgen:
    Ein Programm ist fehlerhaft (ill-formed), wenn sich die Bedeutung einer Memberdeklaration änderte, wenn einer Klassendefinition ein zweites mal geparsed wird:
    Im ersten Durchgang würden in
    klass (*klass) (klass)
    die fetten klass auf die Klasse klass verweisen, mithin ist das eine Definition eines Funktionszeigers.
    Im zweiten Durchgang würden sie hingegen auf den Zeiger klass verweisen (weil die Deklaration eines Objektes die Deklaration eines Typs im gleichen Scope (hier: der injizierte Klassenname) verdeckt), dass ist dann nat. keine gültige Definition mehr.
    Das ist einer der Fälle, in denen der Standard den Compiler nicht verpflicht einen Fehler zu melden.

    A name N used in a class S shall refer to the same declaration in its context and when re-evaluated in
    the completed scope of S. No diagnostic is required for a violation of this rule.



  • camper schrieb:

    wenn ein Konstruktor deklariert wird, dürfen allerdings nicht-statische Member nicht den gleichen Namen wie die Klasse haben.

    No diagnostic is required for a violation of this rule.

    vielen dank für die schnellen und präzisen antworten 🙂


Anmelden zum Antworten