2011-01-10 14 views
12

Quiero asignar un objeto al objeto volátil del mismo tipo, pero no lo hice con el error del compilador. ¿Cómo cambiar el programa para hacerlo? Además de hacer que funcione, ¿por qué no puedo hacerlo directamente?No se puede asignar un objeto a un objeto volátil

Utilicé Visual Studio 2010 como compilador aquí.

class A 
{ 
public: 
}; 

int _tmain() 
{ 
    A a; 
    volatile A va; 
    va = a;  // compiler error:C2678 here 
    return 0; 
} 
+2

'const' y' volatile' son las dos caras de la misma moneda; están tan relacionados que el Estándar a menudo se refiere a ellos como 'cv-qualifiers'. Echa un vistazo a esto: http://stackoverflow.com/questions/4479597/does-making-a-struct-volatile-make-all-its-members-volatile/4479652 – Nawaz

Respuesta

18

es necesario definir una función de operador de asignación para A con el volatile calificador.

class A 
{ 
    public: 

    volatile A& operator = (const A& a) volatile 
    { 
     // assignment implementation 
    } 
}; 

Si no se define un operador de asignación para una clase, C++ creará un operador de asignación por defecto de A& operator = (const A&);. Pero no creará un operador de asignación predeterminado con el calificador volatile, por lo que debe definirlo explícitamente.

+1

Gracias. Creo que el tipo de devolución debería ser 'volátil A &' – Thomson

+0

@Thomson: Sí. Tienes razón. – Nawaz

+0

¿Cómo se resuelve limpiamente este problema si no se controla el tipo 'struct' porque proviene de un archivo de encabezado de plataforma? – Kaz

-1

He codificado la misma pregunta. Por ejemplo:

struct A { int i; } 
volatile A a; 
A b; 
a = b; // C2678 here. 

encontré este método para resolverlo:

const_cast<A &>(a) = b; 
+0

No puede descartar el volátil, su código tiene un comportamiento indefinido. –

+0

@JamesJohnston ¿Tiene una solución más limpia para los casos en los que no controla la definición de estructura? (Como cuando proviene de un encabezado API del sistema?) He ido con esta solución. No creo que el comportamiento no esté definido porque este no es el calificador 'const'. La asignación a un objeto está permitida sea o no 'volátil', y' volátil' no es un tipo especial de acceso; el calificador solo afecta la optimización (si dos o más accesos se fusionan en uno). Eso no importa en mi situación particular; no puede ser un problema. – Kaz

+0

Lo siento, pero creo que estás equivocado y el comportamiento ES indefinido. Consulte http://stackoverflow.com/a/7368038/562766 - desde C11: "Se intenta referir a un objeto definido con un tipo calificado volátil mediante el uso de un lvalue con tipo no volátil calificado (6.7 .3) "--- en el ejemplo anterior, volátil es reemplazado por" a ", que originalmente fue definido con volátil, y luego es asignado. La corrección de su código ahora está a merced del optimizador. –

Cuestiones relacionadas