2009-03-26 11 views
11

Sto tentando di utilizzare un tipo di ritorno const MyClass * const. Tuttavia, viene visualizzato un avviso:Perché il mio tipo di ritorno è privo di significato?

Avviso: # 815-D: il tipo di qualificatore sul tipo restituito non ha significato.

Non è un tipo valido? Voglio un puntatore che non può essere modificato, e voglio che anche la cosa a cui punta non venga modificata.

+0

Quali flag di compilazione e compilazione stai utilizzando? – Trent

+1

RVCT 3.1 e non so cosa contrassegna l'intestino dei flag del sistema di compilazione sono nascosti a noi semplici mortali – Dynite

risposta

22

Il puntatore stessa ha tipo di valore, in modo che non ha senso per renderlo const. Ciò che la funzione chiamante fa con il valore restituito non può essere limitato dalla funzione chiamata. Questo è simile a cercare di definire qualcosa come:

const int getInt(); 

getInt(), in questo caso, solo restituisce un valore int (non un riferimento). Va a un registro, quindi la funzione chiamante lo riceve e fa ciò che vuole con esso.

+0

Quindi in pratica puoi solo definire i tipi di ritorno const con i riferimenti? – Dynite

+0

Sì (per riferimento, che significa sia riferimenti che oggetti puntati). Il puntatore stesso non può essere const, è solo un valore copiato in giro. – Juliano

+0

Il puntatore non può essere const quando viene restituito da una funzione, ma è possibile avere un puntatore const in un sito di chiamata (vedere la mia risposta di seguito). Ciò impedisce a qualcuno di riassegnare inavvertitamente a un puntatore quando si utilizza effettivamente il puntatore. –

0

il qualificatore const non significa nulla perché si sta restituendo un puntatore

4

Perché ti importa se il puntatore viene modificato? Fare questo è come dire:

const int f() { 
    ... 
} 

Il valore restituito da f() è una copia - che cambia non cambia nulla, quindi non c'è punto nom nel rendere const.

+0

Stavo pensando che non voglio che le persone facciano qualcosa come pointer ++, perché la dimensione di ogni singolo oggetto non è la stessa. – Dynite

+3

@Dynite, questo è come dare alla gente il tuo indirizzo, ad es. 80, Main Street, e poi chiedersi cosa succederà se suoneranno il campanello su 81, Main Street. –

+0

@Dynite - come sottolinea daniel, possono farlo comunque, quindi non ottieni nulla tranne un esercizio extra con tastiera –

4

Un modo semplice per assicurarsi che si stia definendo il tipo di reso desiderato è aggiungere sempre i modificatori sul lato destro (opposto a sinistra) del tipo originale.

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 

Questo dovrebbe contribuire a rendere che i tipi di ritorno non sono mai prive di significato :) nuovo

+1

Dalla domanda: "il puntatore di non può essere cambiato, e ... la cosa che indica di non essere modificato neanche". Ha dichiarato il tipo di reso in base alle sue intenzioni. – Trent

+0

Sì, lo ha fatto. E ha ottenuto solo un avvertimento del compilatore su ciò che non ha senso su questo valore di ritorno. – dragonfly

5

Sono d'accordo con la risposta di Juliano, si desidera che il constness del puntatore di essere al sito di chiamata.

Un modo migliore per fare ciò che si sta cercando è quello di avere la funzione restituire un riferimento const all'oggetto:

const MyClass& getMyClass() 
{ 
    return myClass; 
} 

da riferimenti definizione non possono essere modificati, in modo da sarebbe meglio .

Ovviamente questo non funziona se la tua funzione sta tentando di creare un oggetto MyClass. In tal caso puoi semplicemente spostare il const extra sul sito di chiamata.

// 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

Perché restituire un valore const? Si consideri il seguente (e vi prego di scusare i nomi delle variabili privo di fantasia):

struct A { int a; }; 

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

Dato che la dichiarazione di operator+, posso effettuare le seguenti operazioni:

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

Proprio così, ho appena assegnato alla temporanea A che è stato restituito da operator+. Il valore risultante di d.a è 4, non 5.La modifica del tipo restituito da operator+ a const A impedisce questo incarico, causando l'espressione (a+b) = c per generare un errore del compilatore.

Se provo ad assegnare un puntatore o un intero restituito da una funzione, il mio compilatore (MSVC) genera un errore "l'operando sinistro deve essere di tipo l", che sembra coerente con il compilatore ARM che ti dice che la costanza di il puntatore non ha significato: il puntatore non può essere assegnato comunque. Ma per le classi/le strutture, a quanto pare va bene assegnare a valori di ritorno non const.

Problemi correlati