Questo sembra essere simile a POD structs containing constant member, ma in ordine inverso.Unione contenente strutture volatili
#include <iostream>
struct A
{
int a;
};
union U
{
volatile A a;
long b;
};
int main()
{
U u1;
U u2;
u1.a.a = 12;
u2 = u1;
std::cout << u2.a.a << std::endl;
return 0;
}
g ++ 4.8.3 compila questo codice senza errori e funziona correttamente:
$ g++ -std=c++03 a.cpp -o a_gcc
$ ./a_gcc
12
Ma clang ++ 3.5.1 produce un errore (ho avvolto manualmente il messaggio di errore per mantenere la casella codice scrolling):
$ clang++ -std=c++03 a.cpp -o a_clang
a.cpp:8:7: error: member function 'operator=' not viable: 'this'
argument has type 'volatile A', but function is not marked volatile
union U
^
a.cpp:3:8: note: 'operator=' declared here
struct A
^
a.cpp:20:5: note: implicit copy assignment operator for 'U' first
required here
u2 = u1;
^
1 error generated.
Does C++ 03 consentire al programma di copia-assegnare un'unione che contiene le strutture volatili? Non ho trovato nulla nello standard C++ 03 che definisce il costruttore di copie predefinito di un sindacato.
Mi piacerebbe sapere quale compilatore è corretto o se lo standard non è chiaro su quel punto.
Modifica: Ho scoperto che se uso la costruzione di copia anziché l'assegnazione della copia, sia clang ++ che g ++ compileranno il programma senza errori. In particolare se cambio main
essere:
int main()
{
U u1;
u1.a.a = 12;
U u2 = u1;
std::cout << u2.a.a << std::endl;
return 0;
}
.. allora funzionerà. Mi chiedo perché vengono trattati in modo diverso da clang ++.
Cosa succede se si aggiunge un operatore di assegnazione definito dall'utente in 'union U':' volatile U & operator = (const volatile U &) volatile'? O forse solo con alcune di quelle volatili? –
Perché non rendere volatili le istanze del sindacato invece di rendere instabili i membri del sindacato? Sembra più facile ragionare sul suo comportamento in questo modo. – BlamKiwi
@JohnZwinck Perché non causerà questo problema. – qbt937