2009-10-22 15 views
21

Sagen, ich habe dieses Beispiel:Warum ist ein Typ-Qualifier auf einem Rückgabetyp bedeutungslos?

char const * const 
foo(){ 
    /* which is initialized to const char * const */ 
    return str; 
} 

Was ist der richtige Weg, es zu tun, um die Compiler-Warnung „Qualifier auf Rückgabetyp ist sinnlos“ zu vermeiden?

+5

Ist es nur mir oder dieser Frage mangelt es an Klarheit? – jldupont

+2

@ Jean-Lou: Ich stimme zu, dass der Körper der Frage selbst etwas vage ist, aber der Titel der Frage vermittelt seine Bedeutung. – sbi

Antwort

22

Die Art und Weise, wie Sie es geschrieben haben, hieß es "der zurückgegebene Zeigerwert ist const". Aber nicht-type rvalues ​​sind nicht modifizierbar (von C geerbt), und daher sagt der Standard, dass nicht-klasse type rvalues ​​niemals const-qualifiziert sind (ganz rechts const wurde ignoriert, auch wenn sie von dir spezifiziert wurden), da const irgendwie überflüssig wäre . Man braucht es nicht schreiben - Beispiel:

int f(); 
    int main() { f() = 0; } // error anyway! 

    // const redundant. returned expression still has type "int", even though the 
    // function-type of g remains "int const()" (potential confusion!) 
    int const g(); 

Beachten Sie, dass für die Art von „g“, die const ist signifikant, aber für rvalue Ausdrücke erzeugt von Typ int const die const ignoriert. Also folgende ist ein Fehler:

int const f(); 
    int f() { } // different return type but same parameters 

Es gibt keine Möglichkeit, mir bekannt ist, dass Sie die „const“ anders als immer in der Art von „g“ beobachten konnten selbst (und vorbei &f zu einer Vorlage und ableiten seine Art , beispielsweise). Beachten Sie, dass "char const" und "const char" den gleichen Typ bedeuten. Ich empfehle Ihnen, sich mit einer Idee zufrieden zu geben und diese im gesamten Code zu verwenden.

+7

Ich empfehle, immer nach "const" (char const * const) zu verwenden, da dies die einzige Möglichkeit ist, const * konsistent * zu verwenden. Allerdings bin ich auf diese Weise stark in der Unterzahl ... – DevSolar

+0

@DevSolar: Die meisten Gurus (Sutter zum Beispiel) scheinen mit Ihnen übereinzustimmen und platzieren Qualifier NACH dem Typ (Klasse const &, Klasse volatile). –

+1

@DevSolar, nur um zu verdeutlichen: Sie stimmen nicht mit dir über die letzte nachträgliche const überein. Sie können mit Ihrer ersten const übereinstimmen, die nach dem Typnamen angezeigt wird. –

4

In C, weil Funktion Rückgabewerte und qualifizierende Werte bedeutungslos ist.
Es kann in C++ anders sein, überprüfen Sie andere Antworten.

const int i = (const int)42; /* meaningless, the 42 is never gonna change */ 
int const foo(void); /* meaningless, the value returned from foo is never gonna change */ 

Nur Objekte können sinnvoll qualifiziert werden.

const int *ip = (const int *)&errno; /* ok, `ip` points to an object qualified with `const` */ 
const char *foo(void); /* ok, `foo()` returns a pointer to a qualified object */ 
+0

Beachten Sie, dass für Klassen der Wert "const" für Rückgabewerte nicht bedeutungslos ist, da Sie modifizierende Elementfunktionen für nicht konstante rvalues ​​aufrufen dürfen. (Wir hatten das gerade neulich mit Streichern hier: '(s1 + s2) .append (s3)'.) Wie üblich erklärt litbs Antwort all dies sowohl im Detail als auch in der Korrektheit. – sbi

+0

Ich meinte meine Antwort nur mit C zu tun. Aktualisiert, um das zu berücksichtigen. – pmg

+0

Ah, er hat eine "C/C++" Frage gestellt. (Seltsame Sprache, das.) Entschuldigung, ich hatte das auch nicht gesehen. – sbi

1

Keine der vorherigen Antworten beantworten tatsächlich den "richtigen Weg, es zu tun" -Teil der Frage.

Ich glaube, die Antwort ist:

char const * foo(){ 

, die sagt, dass Sie einen Zeiger einen konstanten Charakter zurückkehren.

+0

Ich verstehe, dass dies ein konstanter Zeiger auf ein Zeichen, kein Zeiger auf eine Konstante char – atlex2

+0

Nein, eigentlich @ user1076543 ist richtig, es ist ein Zeiger auf eine Konstante char als 'char const *' und 'const char *' sind die gleich. Ein konstanter Zeiger auf ein Zeichen wäre 'char * const'. –

Verwandte Themen