Merkwürdige Deklaration



  • Was genau deklariert diese Zeile?

    struct a a::*b();
    

    Und wie genau wird das hier in einen bool gecastet?

    bool c() {
        return b();
    }
    

  • Mod

    1. b ist eine Funktion, die einen Pointer auf einen Member der Klasse a vom Typ struct a zurück gibt. Wie eine Klasse a ein struct a enthalten soll, ist mir rätselhaft. Hast du den Ausdruck wirklich richtig vereinfacht? Fehlt da vielleicht ein weiterer *?
    2. Welcher Cast? Da ist eine Implizite Typumwandlung, die was auch immer b() zurück gibt als bool interpretiert. Nicht anders als int returns_2(){ return 2.5;}. Wie implizite Typumwandlungen genau funktionieren ist nicht kurz erklärbar. Aber wenn du es als Kurzform willst, dann gilt grob, dass sich die eingebauten arithmetischen Typen so verhalten, wie man intuitiv von Zahlen erwarten würde, und nutzerdefinierte Typen können (und müssen!) selber definieren, wie sie konvertierbar sind.

    PS: Für zukünftige Fragen zu C-Gibberish Deklarationen: https://cdecl.org/?q=struct+a+a%3A%3A*b()%3B



  • @SeppJ sagte in Merkwürdige Deklaration:

    1. b ist eine Funktion, die einen Pointer auf einen Member der Klasse a vom Typ struct a zurück gibt. Wie eine Klasse a ein struct a enthalten soll, ist mir rätselhaft. Hast du den Ausdruck wirklich richtig vereinfacht? Fehlt da vielleicht ein weiterer *?

    Es kompiliert so. Von daher .. Das ganze stammt aus cvise. Das soll testcases minimieren und manchmal kommen da sehr schräge Konstrukte raus, die aber tatsächlich kompilieren.

    1. Welcher Cast? Da ist eine Implizite Typumwandlung, die was auch immer b() zurück gibt als bool interpretiert.

    Der ImplicitCast, der ins ReturnStmt geht:

    `-FunctionDecl 0x56220c1b9278 <line:2:1, line:4:1> line:2:6 c 'bool ()'
      `-CompoundStmt 0x56220c1b9438 <col:9, line:4:1>
        `-ReturnStmt 0x56220c1b9428 <line:3:2, col:11>
          `-ImplicitCastExpr 0x56220c1b9410 <col:9, col:11> 'bool' <MemberPointerToBoolean>
            `-CallExpr 0x56220c1b93f0 <col:9, col:11> 'struct a a::*'
              `-ImplicitCastExpr 0x56220c1b93d8 <col:9> 'struct a a::*(*)()' <FunctionToPointerDecay>
                `-DeclRefExpr 0x56220c1b9360 <col:9> 'struct a a::*()' lvalue Function 0x56220c1b9128 'b' 'struct a a::*()'
    

    PS: Für zukünftige Fragen zu C-Gibberish Deklarationen: https://cdecl.org/?q=struct+a+a%3A%3A*b()%3B

    Den kannte ich noch nicht. Geht der auch für c++?


  • Mod

    @Tyrdal sagte in Merkwürdige Deklaration:

    Den kannte ich noch nicht. Geht der auch für c++?

    So ein bisschen. Templates kann es nicht, class kennt es, Pointer to Memberfunktionen kennt es, anderes (was gibt's darüber denn noch für Deklarationen in C++, die es in C nicht gibt?) habe ich nicht probiert. Wenn man also Templates selber auflöst (indem man das template<…> einfach weglässt und struct oder cclass vor die Typen schreibt), sollte es alles können.

    Hast du noch eine Frage zu dem "Cast"?



  • @SeppJ Nö, hab mein Problem mit dem 1. Hinweis jetzt gelöst bekommen. Danke.


Anmelden zum Antworten