2012-04-05 12 views
5

Wenn der Elementtyp const int ist, sollte die Zuweisungsanweisung nicht einer const int& zugeordnet werden? Dies wird nicht mit LLVM 3.0 kompiliert. Warum lässt VC++ es zu?Warum ermöglicht VC++ 2010 dies zu kompilieren?

+2

Sie offenbar nicht verstehen, was das "undefined" Wort in "undefined Verhalten" bedeutet. – 6502

+0

Schmeichelei wird dich überall hinbringen - ich hätte das ein bisschen besser sagen können. – Tabber33

+1

Entschuldigung, ich wollte nicht beleidigend sein, aber ziemlich oft undefiniertes Verhalten wird fälschlicherweise für einen Runtime Crash oder eine Kompilierfehlergarantie gehalten. Nichts könnte weiter von der Wahrheit entfernt sein. C++ ist voll von Orten, an denen etwas, das vernünftig erscheinen könnte, tatsächlich verboten ist, aber der Compiler nicht für die Überprüfung zuständig ist. Undefiniertes Verhalten bedeutet, dass Sie das nicht tun ... bedeutet, dass die Compiler-Autoren frei davon ausgehen können, dass ein Programmierer das nicht tun wird. Das Schlimmste, was passieren kann, ist in der Tat einfach "nichts" ... oder besser nichts zu sagen bis zum Demo oder Deploy-Tag. – 6502

Antwort

8

Während es ist Undefined Behavior und im Grunde alles kann passieren, einschließlich, was Sie sehen, habe ich dies auf, was eine Inkompatibilität der Bibliothek mit dem Standard zu sein scheint. Insbesondere entspricht der in der VS2010-Bibliothek definierte Standardzuordner nicht dem Standard.

Der Standard schreibt vor, dass std::vector<T,Allocator>::value_type ein typedef zu Allocator::value_type ist. Jetzt ist der Standardzuordner (falls keiner bereitgestellt wird) std::allocator<T>, für den value_type, entsprechend Tabelle 28 muss sein muss Identisch mit T. Die Implementierung des Standardzuordners in VS2010 löscht nun das const-Qualifikationsmerkmal aus dem Typargument, sodass T ist und nicht const T.

Es ist wichtig zu beachten, dass der Compiler für das Akzeptieren des per se bereitgestellten Codes nicht nicht konform ist, da es Undefined Behavior ist und der Compiler frei ist, es nach Belieben zu tun. Auf der anderen Seite gibt es eine Nichtkonformität in der std::allocator Implementierung.

Sie haben die Frage bereits selbst beantwortet: Es ist Undefined Behavior. Der Compiler muss keine Diagnose bereitstellen, und das Ergebnis der Operation kann alles sein. Es ist ein Fall von Qualität der Implementierung zu erkennen, dass der Typ nicht zuweisbar ist und eine sinnvolle Fehlermeldung (oder nicht)

+1

Allerdings würde man erwarten, dass bei irgendeiner praktischen Implementierung von 'std :: vector' irgendwo versucht würde, eine Zuweisung zu machen, was zu einem Flat-Out-Compiler-Fehler führen sollte. Die Tatsache, dass dies nicht geschieht, macht es interessant; Welche Tricks zieht die MSVC-Implementierung an? –

+0

Sie möchten nicht wissen, welchen Fehler g ++ ausspuckt. –

+0

@MrLister: Zu spät, ich habe mir schon die Augen verbrannt ... –

Verwandte Themen