2016-03-29 5 views
0

Ich weiß, das ist eine einfache Frage, aber ich habe seit einiger Zeit gegoogelt, und von dem, was ich gefunden habe, verstehe ich immer noch nicht das Problem. Ich habe diesen einfachen Code:verstehe nicht, warum const Qualifizierer verworfen werden

class X { 
    public: 
     X() : x_(42) {}; 
     virtual const long long f() const { 
      return do_f(); 
     } 
    protected: 
     virtual const long long do_f() const { 
      return x_; 
     } 
     long long x_; 
}; 

auto main() -> int { 
    X x; 
    x.f(); 
} 

ich es zu kompilieren erwarten, weil ich sehe nicht, wie diese Methoden Objekt von X ändern Aber offensichtlich etwas, was ich vermisse, denn:

[email protected] /tmp $ g++ --std=c++14 -Werror=ignored-qualifiers 1.cpp   
1.cpp:6:37: error: type qualifiers ignored on function return type [-Werror=ignored-qualifiers] 
     virtual const long long f() const { 
            ^
1.cpp:10:40: error: type qualifiers ignored on function return type [-Werror=ignored-qualifiers] 
     virtual const long long do_f() const { 
             ^
cc1plus: some warnings being treated as errors 
[email protected] /tmp $ 

Antwort

4

Die const-Fehler, die Sie bekommen, sind nicht mit dem const Qualifier der Funktion verbunden (der letzte const), sondern mit dem const Qualifier des Rückgabetyps (der erste const).

Da es sich um Integer-Typen handelt, die vom Wert zurückgegeben werden, nicht als Referenz, so dass sie nicht das Qualifikationsmerkmal 10 benötigen. Dies gilt für alle Typen (eingebaut oder benutzerdefiniert), die von Wert zurückgegeben werden.

So die Definition Ihrer Funktionen sollte wie folgt lauten: „Da sie Integer-Typen sind, werden sie von Wert zurückgegeben, nicht Bezug genommen wird, so dass sie nicht die constqualifier brauchen“

virtual long long f() const; 
    virtual long long do_f() const; 
+0

Ich stimme nicht zu - der Rückgabetyp macht keinen Unterschied. Sie können eine ganze Zahl als Referenz zurückgeben, und dann würde die 'const' vollständig Sinn machen. –

+0

@LuchianGrigore ok, Satz neu geschrieben. – LoPiTaL

+0

Diese Antwort kann leicht einen falschen Eindruck vermitteln. Ich stimme nicht ab, da es unter allen vernünftigen Interpretationen nicht inkorrekt ist, aber ich stimme auch nicht zu. –

Verwandte Themen