2009-03-26 12 views
11

Ich versuche, einen Rückgabetyp von const MyClass * const zu verwenden. Allerdings erhalte ich eine Warnung:Warum ist mein Rückgabetyp bedeutungslos?

Warnung: # 815-D: Typ Qualifier auf Rückgabetyp ist bedeutungslos.

Ist das kein gültiger Typ? Ich möchte einen Zeiger, der nicht geändert werden kann, und ich möchte, dass das, worauf er hinweist, auch nicht geändert wird.

+0

Welche Compiler- und Kompilierungsflags verwenden Sie? – Trent

+1

RVCT 3.1 und ich weiß nicht, welche Flags die Eingeweide der Build-System-Flags sind von uns versteckt Sterbliche – Dynite

Antwort

22

Der Zeiger der Rückkehr selbst Werttyp hat, so dass es nicht sinnvoll, es konst zu machen. Was die Caller-Funktion mit dem zurückgegebenen Wert macht, kann nicht durch die aufgerufene Funktion eingeschränkt werden. Dies ist vergleichbar mit dem Versuch, so etwas wie zu definieren:

const int getInt(); 

getInt(), in diesem Fall nur gibt einen int-Wert (keine Referenz). Es geht in ein Register, dann empfängt die Anruferfunktion es und macht damit, was es will.

+0

Also im Grunde können Sie nur const Rückgabetypen mit Referenzen definieren? – Dynite

+0

Ja (durch Verweis, was sowohl Referenzen als auch spitze Objekte bedeutet). Der Zeiger selbst kann nicht const sein, es wird nur ein Wert kopiert. – Juliano

+0

Der Zeiger kann nicht const sein, wenn er von einer Funktion zurückgegeben wird, aber Sie können einen Const-Zeiger an einer Call-Site haben (siehe meine Antwort unten). Dies verhindert, dass jemand versehentlich einen Zeiger neu zugewiesen, wenn Sie den Zeiger tatsächlich verwenden. –

0

das const-Qualifikationsspiel hat nichts zu bedeuten, weil Sie einen Zeiger

4

Warum interessiert es dich, wenn der Zeiger geändert wird? dies zu tun, ist wie wenn man sagt:

const int f() { 
    ... 
} 

Die von f zurückgegebene Wert() ist eine Kopie - ändert es nichts ändert, so gibt es nom Punkt es const zu machen.

+0

Ich dachte, ich möchte nicht, dass Leute etwas wie Zeiger ++ machen, weil die Größe jedes einzelnen Objekts nicht gleich ist. – Dynite

+3

@Dynite, das ist so, als würde man Leuten Ihre Adresse geben, z. B. 80, Main Street, und sich dann fragen, was passiert, wenn sie auf der 81, Main Street klingeln. –

+0

@Dynite - wie daniel darauf hinweist, können sie es trotzdem tun, also bekommst du nichts außer ein paar extra Tastaturübungen –

4

Eine einfache Möglichkeit, um sicherzustellen, dass Sie den gewünschten Rückgabetyp definieren, besteht darin, immer Modifikatoren auf der rechten (im Gegensatz zur linken) Seite des Originaltyps hinzuzufügen.

MyClass     // MyClass object 
MyClass const   // MyClass object which can't be modified 
MyClass const &   // reference of an unmodifiable MyClass object 
MyClass const *   // pointer to an unmodifiable MyClass object 
MyClass const * const // unmodifiable pointer to an unmodifiable MyClass object 
MyClass const * const & // reference of an unmodifiable pointer to an unmodifiable MyClass object 

Das Ihre Rückgabetypen sind nie sinnlos sicher wieder :)

+1

Von der Frage: "Zeiger als kann nicht geändert werden, und ... das Ding, auf das es hinweist, um auch nicht geändert zu werden." Er hat den Rückgabetyp auf Grund seiner Absichten korrekt deklariert. – Trent

+0

Ja, hat er. Und er bekam nur einen Compiler, der über den Sinn des Materials auf den Rückgabewert hinwies. – dragonfly

5

Ich stimme mit Juliano Antwort, möchten Sie die Konstantheit des Zeigers helfen sollte, an der Aufrufstelle sein.

Eine bessere Art und Weise zu tun, was Sie suchen, Ihre Funktion auf das Objekt eine konstante Referenz zurückkehren müssen, ist:

const MyClass& getMyClass() 
{ 
    return myClass; 
} 

Definitions Referenzen können nicht geändert werden, so dass Sie besser dran seien, .

Natürlich funktioniert das nicht, wenn Ihre Funktion versucht ein MyClass-Objekt zu erstellen. In diesem Fall können Sie einfach den zusätzlichen const zur Aufrufseite verschieben.

// function definition 
const MyClass* createMyClass() 
{ 
    return new MyClass("I Love C++"); 
} 

// use of a const pointer to a MyClass which is const 
const MyClass* const myClassInstance = creatMyClass(); 
0

Warum einen konstanten Wert zurückgeben? Betrachten Sie die folgende (und entschuldigen Sie bitte die einfallslosen Variablennamen):

struct A { int a; }; 

A operator+(const A& a1, const A& a2) 
{ 
    A a3 = { a1.a + a2.a }; 
    return a3; 
} 

dass Erklärung operator+ gegeben, ich kann Folgendes:

A a = {2}, b = {3}, c = {4}, d = ((a+b) = c); 

Das ist richtig, ich zugewiesen nur auf die temporäre A dass wurde von operator+ zurückgegeben. Der resultierende Wert von d.a ist 4, nicht 5.Das Ändern des Rückgabetyps von operator+ zu const A verhindert diese Zuordnung, wodurch der Ausdruck (a+b) = c einen Compiler-Fehler generiert.

Wenn ich versuche, einen Zeiger oder einen von einer Funktion zurückgegebenen Integer zuzuweisen, generiert mein Compiler (MSVC) einen Fehler "linker Operand muss L-Wert sein", der konsistent mit dem ARM-Compiler zu sein scheint Der Zeiger ist bedeutungslos - der Zeiger kann nicht zugewiesen werden. Aber für Klassen/Strukturen ist es anscheinend ok, nicht-konstanten Rückgabewerten zuzuordnen.

Verwandte Themen