2012-10-02 19 views
9

esiste un modo, in C++, per forzare l'assegnazione del valore restituito di una funzione? cioè se ho una funzione membro fooforza oggetto restituito da assegnare

class myClass{ 
    ... 
    public: 
    T1 foo(T2 x){T1 y; /*something*/ return y;}; 
} 

che posso chiamare in main() come

myClass obj; 
T1 a = obj.foo(x); //<-- 

posso effettuare la chiamata semplice

myClass obj; 
obj.foo(x); //<-- 

(che non fa memorizzare il valore restituito) in qualche modo "illegale"?

In alternativa, posso distinguere le definizioni di

T1 a = obj.foo(x); 
obj.foo(x); 

grazie per il vostro tempo e scusa per la mia ignoranza

+1

Non c'è niente di particolarmente sbagliato nello scartare i valori di ritorno. Inoltre, anche se ci fosse un tale modo - che dire di 'somefunc (obj.foo (x))'? – Cubic

+0

Cosa stai cercando di ottenere che lo renda necessario? –

risposta

3

No, non c'è alcun modo per imporre un'operazione su un oggetto restituito.

E no, non è possibile distinguere tra

T1 a = obj.foo(x); 
obj.foo(x); 

all'interno delle chiamate (almeno non in un modo standard portatile. Si potrebbe incidere via con call-stack e tali, ma perché voi) .

2

Non c'è modo di dirlo, ma i buoni strumenti di analisi statica spesso mostrano avvertimenti se i valori di ritorno sono ignorati. Quello che uso che viene fornito con MSVC2010 certamente lo fa.

3

Risposta semplice no; tuttavia è possibile "forzarlo":

restituisce il puntatore intelligente che viene automaticamente distrutto quando non ci sono riferimenti. Nel distruttore lanciare qualche eccezione o effettuare una chiamata assert(). Per evitare crash se usato correttamente, puoi usare alcune variabili in quella classe e impostarlo su false quando sei sicuro di non aver più bisogno di oggetti e questo dirà al distruttore di non lanciare nulla.

+2

Questo meccanismo è piacevole, ma ovviamente è una sorta di controllo "in fase di esecuzione". Grazie mille. – Acorbe

7

Se stai usando g ++, è possibile utilizzare

T1 foo(T2 x) __attribute__ ((warn_unused_result)); 

questo si tradurrà in un avvertimento, però, non è un errore. Ma potresti probabilmente usare un flag -Werror = * per trasformarlo in un errore. Vedere here per tutti gli attributi di funzione supportati.

+0

Questo è molto vicino a ciò di cui ho bisogno. Potrei essere un po 'non portatile, però. Esplorerò questo modo tra l'altro. grazie. – Acorbe

Problemi correlati