Ich schaute durch die Interview Fragen zu einem Junior C++ Entwickler-Position. Die Frage ist (Zitat):Ändern konstantes Objekt
Ist der folgende Code korrekt?
struct Foo
{
int i;
void foo (void) const
{
Foo* pointer = const_cast<Foo*>(this);
pointer->i = 0;
}
};
Ich würde antworten: erfolgreich
Der Code selbst 03 nach dem C++ gültig ist und C++ 11-Standards und kompilieren. Aber es kann ein undefiniertes Verhalten während der Zuweisung Zeiger-> i = 0; Wenn die Instanz der Klasse, für die foo() aufgerufen wird, als const deklariert wird.
Ich meine, dass der folgende Code wird erfolgreich kompilieren und zu undefiniertem Verhalten führen.
struct Foo
{
int i;
Foo (void)
{
}
void foo (void) const
{
Foo* pointer = const_cast<Foo*>(this);
pointer->i = 0;
}
};
int main (void)
{
Foo foo1;
foo1.foo(); // Ok
const Foo foo2;
foo2.foo(); // UB
return 0;
}
Ist meine Antwort korrekt oder fehlt mir etwas? Vielen Dank.
Ja, es ist korrekt. –
"Korrekt" ist eher ein vages Wort. Es ist * wohlgeformt *, was bedeutet, dass es keine diagnostizierbaren Fehler gibt, aber (wie Sie sagen) zu undefiniertem Verhalten führen kann. –
IMO von einem Design-POV ist es nicht "richtig" weil 'const Foo foo; foo.foo(); 'sollte nicht UB sein. Ein "veränderbares" Mitglied wäre besser. – StackedCrooked