2016-11-16 1 views
0

Ich habe mir das answer angesehen und wollte es benutzen. Allerdings bekomme ich einen Segmentierungsfehler, wenn ich die static_cast und const_cast verwende, aber wenn ich eine Temp-Variable verwende, ist alles in Ordnung. Es ist offensichtlich, weil die nicht-const-Version von bar() es selbst over-and-over nennt. Aber ich würde die static_cast in einem const foo* führen und dann die const-Version von bar() wählen. Warum ist das so?Warum fügt const_cast (oder static_cast) const nicht hinzu?

#include <iostream> 
using namespace std; 

class foo 
{ 
    public: 
    void bar() const 
    { 
     cout << "const" << endl; 
    } 

    void bar() 
    { 
     cout << "non-const" << endl; 

//  static_cast<const decltype(this)>(this)->bar(); 

//  const_cast<const decltype(this)>(this)->bar(); 

     const auto& tmp = *this; 
     tmp.bar(); 
    } 
}; 

int main() { 
    foo A; 
    A.bar(); 
    const foo B; 
    B.bar(); 
    static_cast<const foo*>(&A)->bar(); 
    return 0; 
} 
+0

@songyuanyao, entfernen Sie die kommentierten Zeilen. Es wird für immer rekursiv – StoryTeller

+1

'this' ist ein Zeiger, so hat es Typ' foo * '. Wenn Sie constness zu 'foo *' hinzufügen, erhalten Sie 'foo * const', nicht' foo const * ', wie Sie vielleicht erwarten. – ach

Antwort

5

decltype(this) ist foo*. Und const decltype(this) ist foo* const.

Sie ändern nicht die Pointees cv-Qualifikationen, nur die Zeiger. Daher wird die nicht-konstante Überlastung jedes Mal ausgewählt.

+1

Ok, das macht Sinn. Ich denke, das gleiche passiert, wenn ich es auf eine Referenz stelle, dann wäre es ein 'foo & const' (was Unsinn ist) anstelle von 'const foo &'. – Jonas

+1

Dies deutet auch darauf hin, was stattdessen getan werden könnte, aber könnte nützlich sein, um explizit zu erwähnen: 'static_cast *> (this)' sollte funktionieren. Es ist zwar lang, aber es vermeidet, was das OP meines Erachtens vermeiden wollte: es vermeidet, den Typ explizit anzugeben. – hvd

+1

@hvd, kann man auch 'static_cast :: type> (this)' verwenden, wo die Metafunktion so etwas wie [this] definiert ist (http://ideone.com/RPGzLf). Habe das aber noch nicht gründlich getestet. – StoryTeller

Verwandte Themen