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?
Antwort
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)
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? –
Sie möchten nicht wissen, welchen Fehler g ++ ausspuckt. –
@MrLister: Zu spät, ich habe mir schon die Augen verbrannt ... –
- 1. Warum stürzt der VC++ 2010-Compiler beim Kompilieren von einfachem Code ab?
- 2. Visual C++ 2010 Kompatibilität mit VC 2008
- 3. Wie Downgrade von VC++ 2010-Projekt auf VC++ 2008?
- 4. VC++ Fehler kompilieren, wenn gl.h
- 5. Verwenden Sie VC++ 2010 Laufzeitbibliotheken in VC++ 2008 Projekt
- 6. Wie kompilieren VC++ 2010 Projekte mit Visual Studio 2012 und Windows SDK 7.1
- 7. Was bedeutet "Join" im Thread (VC++ 2010)?
- 8. Warum Compiler ermöglicht Konvertierungen zu verengen
- 9. Problem beim Kompilieren im Freigabemodus --VC++
- 10. Fehler beim Kompilieren von rtmpd in VC++
- 11. Deaktivierung von C++ 0x-Funktionen in VC 2010?
- 12. VC++ 2010 will Boost Libararies verknüpfen ich nicht einmal
- 13. Ist es möglich, ffmpeg in Visual Studio 2010 zu kompilieren?
- 14. VC++ LNK2001: ungelöst externes Symbol nur beim Kompilieren auf 64bit
- 15. Warum ergibt dies CS0695?
- 16. Problem mit "beweglichen Nur-Typ" in VC++ 2010
- 17. vorkompilierte .libs für Boost auf 64-Bit-VC++ 2010
- 18. Warum ermöglicht mir dieser Code, einen Debugger zu erkennen?
- 19. Warum kann MSVC diese Vorlagenfunktion nicht kompilieren?
- 20. Problem beim Kompilieren einer Header-Datei in VC++
- 21. Warum sind Vorlagen so langsam zu kompilieren?
- 22. Warum gcc kompilieren _mm256_permute2f128_ps zu Vinsertf128 Anweisung?
- 23. Ich kann nicht in Visual Studio 2010 kompilieren
- 24. Warum führt dieser Code zum Absturz des VC++ - Compilers?
- 25. Warum kompiliert Eclipse dies, aber Javac nicht?
- 26. Wie portiere ich Code, der #pragma enthält, optimieren ("a") von VC++ 7 zu VC++ 9?
- 27. f # kompilieren zu langsam
- 28. Warum verursacht dies einen Syntaxfehler?
- 29. Konfigurieren Sie den Nachrichtencompiler (MC.exe) als einen benutzerdefinierten Compilerschritt in VC++ 2010?
- 30. MS VC++ Compiler-Äquivalenz
Sie offenbar nicht verstehen, was das "undefined" Wort in "undefined Verhalten" bedeutet. – 6502
Schmeichelei wird dich überall hinbringen - ich hätte das ein bisschen besser sagen können. – Tabber33
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