Der folgende Code ist, soweit ich es verstehe, undefiniertes Verhalten nach dem C++ - Standard (insbesondere Abschnitt 7.1.5.1.4 [dcl.type.cv]/4) .Nicht-triviales Beispiel für undefiniertes Verhalten mit 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;
}
Allerdings druckt '8' mit jedem Compiler und Optimierung Einstellung habe ich ausprobiert.
Frage: Gibt es ein Beispiel, das unerwartete Ergebnisse mit dieser Art von "implizitem const_cast" zeigen wird?
Ich hoffe auf etwas so spektakulär wie die Ergebnisse der
#include <iostream>
int main() {
for (int i = 0; i <=4; ++i)
std::cout << i * 1000000000 << std::endl;
}
auf, zB gcc 4.8.5 mit -O2
EDIT: den entsprechenden Abschnitt aus dem Standard-
7.1.5.1.4: Außer dass jedes deklarierte Veränderliche (7.1.1) geändert werden kann, jeder Versuch, ein konstantes Objekt während seiner Lebenszeit zu ändern (3 .8) führt zu undefiniertem Verhalten.
Als Antwort auf den Kommentar, der ein Duplikat vorschlägt; Es ist kein Duplikat, weil ich nach einem Beispiel frage, bei dem "unerwartete" Ergebnisse auftreten.
Das ist eine sehr hinterhältige Einstellung - sehr nett. –
Ich mag die Symptome dieses Schnipsel am unteren Rand. Null, eins, zwei, gib den Kraken frei! – Quentin
Was ist der Wert beim Versuch, undefiniertes Verhalten zu definieren? – lcs