Il seguente codice è, per quanto ho capito, comportamento non definito secondo lo standard C++ (sezione 7.1.5.1.4 [dcl.type.cv]/4 in particolare) .Esempio non banale di comportamento non definito con const_cast
#include <iostream>
struct F;
F* g;
struct F {
F() : val(5)
{
g = this;
}
int val;
};
const F f;
int main() {
g->val = 8;
std::cout << f.val << std::endl;
}
Tuttavia, stampa "8" con ogni impostazione di ottimizzazione e compilatore che ho provato.
Domanda: Esiste un esempio che mostrerà risultati imprevisti con questo tipo di "implicit const_cast"?
spero in qualcosa di spettacolare come i risultati di
#include <iostream>
int main() {
for (int i = 0; i <=4; ++i)
std::cout << i * 1000000000 << std::endl;
}
su, ad esempio, gcc 4.8.5 con -O2
EDIT: la relativa sezione dallo standard
7.1.5.1.4: Tranne che qualsiasi membro della classe dichiarato mutabile (7.1.1) può essere modificato, qualsiasi tentativo di modificare un oggetto const durante la sua durata (3 .8) comporta un comportamento indefinito.
In risposta al commento suggerendo un duplicato; non è un duplicato perché sto chiedendo un esempio in cui si verificano risultati "imprevisti".
Questa è una configurazione molto subdola - molto bella. –
Mi piacciono i sintomi di quello snippet in fondo. Zero, uno, due, rilascia il Kraken! – Quentin
Qual è il valore nel tentativo di definire un comportamento non definito? – lcs