2012-10-02 11 views
9

¿Hay alguna manera, en C++, de forzar la asignación del valor devuelto de una función? es decir, si tengo una función foo miembro deforzar objeto devuelto que se asignará

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

cual puedo llamar en el main() como

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

puedo hacer la llamada más simple

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

(que no lo hace almacenar el valor devuelto) de alguna manera "ilegal"?

Alternativamente, puedo distinguir las definiciones de

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

gracias por su tiempo y lo siento por mi ignorancia

+1

No hay nada particularmente malo en descartar valores devueltos. Además, incluso si hubiera una manera de hacerlo, ¿qué pasa con 'somefunc (obj.foo (x))'? – Cubic

+0

¿Qué intenta lograr que lo haga necesario? –

Respuesta

3

No, no hay ninguna manera de forzar una operación en un objeto devuelto.

Y no, no se puede distinguir entre

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

dentro de las llamadas (al menos no de una manera portátil, estándar. Se podía cortar lejos con Call-pilas y tal, pero ¿por qué usted) .

2

No hay forma de saberlo, pero las buenas herramientas de análisis estático a menudo muestran advertencias si se ignoran los valores de retorno. El que uso que viene con MSVC2010 ciertamente lo hace.

3

La respuesta simple es no; sin embargo, podría "forzarlo":

devolver el puntero inteligente que se destruye automáticamente cuando no tiene ninguna referencia. En destructor arroja alguna excepción o realiza una llamada a assert(). Para evitar el bloqueo cuando se usa correctamente, puede usar alguna variable en esa clase y configurarlo en falso cuando esté seguro de que ya no necesita más objetos y eso le indicará a destructor que no arroje nada.

+2

Este mecanismo es bueno, pero por supuesto es una especie de verificación de "tiempo de ejecución". Muchas gracias por cierto. – Acorbe

7

Si utiliza g ++, podría utilizar

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

Esto dará lugar a una advertencia sin embargo, no es un error. Pero probablemente puedas usar alguna bandera -Werror = * para convertirla en un error. Consulte here para conocer todos los atributos de funciones compatibles.

+0

Esto está muy cerca de lo que necesito. Aunque podría ser un poco poco portátil. Voy a explorar de esta manera por cierto. Gracias. – Acorbe

Cuestiones relacionadas