Dies ist im Grunde eine Fortsetzung von my prior question über DR 712. Lassen Sie mich zuerst erklären, warum ich darauf beharre, etwas zu betrachten, das als alt angesehen werden könnte, wie die C++ 11 Standard, aber mein Problem ist, dass der Abschnitt [basic.def.odr] in C++ 11 schon schwer zu verstehen ist, und ich möchte das vollständig abdecken, bevor ich mich in den gleichen Abschnitt im aktuellen Entwurf vertiefe, was meiner Meinung nach ist noch komplizierter. Die Antwort auf meine vorherige Frage von Austing Hasting s war großartig, aber ich habe noch einen kleinen Punkt, der in [basic.def.odr]/2 in C++ 11 nicht klar ist Betrachten Sie dieses kleine und sehr einfaches Beispiel:Fortsetzung von "Ich kann einfach nicht verstehen, DR 712"
const int i = 1;
int main()
{
int j = i;
}
Von [basic.def.odr]/2 in C++ 11 i
ist nichtodr-used
in int j = i;
als i
ist ein Objekt, das in der Anforderung genügt für das Erscheinen Ein konstanter Ausdruck und die lvalue-to-rvalue-Konvertierung wird sofort auf i
angewendet. Das macht für mich keinen Sinn, da i
eindeutig in der Deklaration int j = i;
verwendet wird, wie in dem leicht modifizierten Code here zu sehen ist, wo ich die Variable i
gezwungen habe, nicht aus dem kompilierten Code optimiert zu werden.
Natürlich muss etwas falsch in meiner Argumentation oben sein, denn ich glaube nicht, dass C++ 11 in so einem einfachen Beispiel falsch liegen könnte. Nochmal, was vermisse ich jetzt ???
Alles, was in Ihrem Beispielcode benötigt wird, ist *** der Wert *** von "i". Das bedeutet, dass es weg optimiert werden kann und keinen zugewiesenen Speicher benötigt. –