2017-09-07 1 views
0

Warum this ist nicht in ungeprüften Kontext in statischen Elementfunktionen zulässig?dies in nicht bewertetem Kontext in statischen Elementfunktionen

struct A 
{ 
    void f() {} 
    static void callback(void * self) // passed to C function 
    { 
     static_cast< decltype(this) >(self)->f(); 
    } 
}; 

Dieser Code gibt einen Fehler:

error: 'this' is unavailable for static member functions

static_cast< decltype(this) >(self)->f(); 
         ^~~~ 

decltype(this) es der Kürze halber benötigt wird (manchmal ist es viel kürzer, dann VeryVeryLongClassName *), ein weiterer Vorteil ist die Tatsache, dass die Absicht mehr klar.

Welcher Standard besagt, dass this in nicht bewerteten Kontexten in statischen Elementfunktionen verwendet wird?

+0

Possible Duplikat [C++ Typ der umschließenden Klasse in statischer Elementfunktion] (https://stackoverflow.com/questions/21143275/c-type-of-enclosing-class-in-static-member-function) –

Antwort

6

Ich sehe nicht, wie es wichtig ist, dass this erscheint in einem unevaluierten Zusammenhang Sie etwas bezeichnet haben, die doesn't exist in einer statischen Member-Funktion, so wie ist der Compiler den Typ des this in diesem Zusammenhang ableiten soll?

Als logische Folge die type of this in einer nicht-statischen Elementfunktion ist auf dem CV-Qualifier abhängig die Elementfunktion decltype(this)T const* ergeben würde, wenn die Elementfunktion const war und T * wenn es nicht ist. Daher hängt der Typ vom Kontext des Ausdrucks ab. In Ihrem Beispiel hat der Kontext keinen this Zeiger.

Um den Aufwand zu verringern, die Klasse benennen zu müssen, können Sie einen Alias ​​hinzufügen.

class VeryVeryLongClassName 
{ 
    using self = VeryVeryLongClassName; 
}; 
Verwandte Themen