Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

11

27.07.2013, 10:05

Der Compiler wird die erste Version nehmen so lange er kann. Ansonsten nimmt er dann den zweiten. Aus dem jeweiligen Kontext ist klar welche Funktion zur Anwendung kommt.

//Edit
An sich sind die Methoden schon Mehrdeutig, aber darum implementiert man die Methoden so, dass bei jedem Einsatz der ersten Variante das gleiche herauskommt, wenn die zweite Variante genommen wird. Umgekehrt ist das ja nicht immer möglich.
Ok, aber wieso lässt der Compiler das überhaupt zu? Ein unterschiedlicher Rückgabetyp reicht beim Überladen ja nicht aus. Reicht dafür schon das rechte const (wäre auch ein weiterer Grund, das beim unteren nicht zu schreiben)? Und laut Kommentaren soll der obere wohl bei Arrayzugriffen auch der rechten Seite von Assignments genommen werden und der untere links. Das läuft dann auch so, ja?
Der untere gibt aber Zugriff auf den jeweiligen Member und erlaubt potentiell, diesen zu verändern. logical vs. binary const... ;)
Das betrifft aber nicht direkt das rechte Funktions-const?! D.h. das könnte man theoretisch auch dazuschreiben, tut es aber der Nachvollziehbarkeit halber nicht?! Ist das mit logical const gemeint?

Und ja, an der Pointer-Arithmetik oder dass man beim Zugriff auf undefinierte Elemente einfach Speicher-Crap anstatt irgendeinem offensichtlichen Fehlverhalten zurückkriegt, habe ich mich auch schon gestört. Trotzdem sollte das doch immer funktionieren, weil die Pointer um sizeof(T) inkrementiert werden?!

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

12

27.07.2013, 11:10

Niemand garantiert Dir, dass zwischen den Elementen nicht noch 2 oder 4 Bytes Padding liegen. Jedenfalls nicht, wenn Du Dich nicht drum kümmerst. Und an denen geht die Arithmetik kaputt.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

13

27.07.2013, 11:17

Ok, aber wieso lässt der Compiler das überhaupt zu? Ein unterschiedlicher Rückgabetyp reicht beim Überladen ja nicht aus. Reicht dafür schon das rechte const (wäre auch ein weiterer Grund, das beim unteren nicht zu schreiben)?

Das rechte const macht die Methode const und gehört, im Gegensatz zum Rückgabetyp, zur Signatur der Funktion. Wenn du eine Funktion const machst, dann sagt du damit, dass diese Funktion auf const Objekten aufgerufen werden kann.

Der untere gibt aber Zugriff auf den jeweiligen Member und erlaubt potentiell, diesen zu verändern. logical vs. binary const... ;)
Das betrifft aber nicht direkt das rechte Funktions-const?! D.h. das könnte man theoretisch auch dazuschreiben, tut es aber der Nachvollziehbarkeit halber nicht?! Ist das mit logical const gemeint?

const auf der Methode sagt nur, dass die Methode auf Objekten aufgerufen werden kann, die const sind. Binary constness bedeutet, dass das Objekt auf Bitebene konstant bleibt, also kein einziges Bit des Objektes verändert werden kann. Von logical constness dagegen spricht man, wenn eine Methode zwar nicht wirklich den Bitpattern des Objektes konstant hält, aber das Objekt auf konzeptioneller Ebene seinen Zustand nicht ändert. Beispiel: Ein Objekt, das zum Zwecke von Debugging oder Profiling einen Zähler enthält, der zählt, wie oft eine Methode aufgerufen wird. Manche Methode ändert zwar immer noch nicht den logischen Zustand des Objektes, muss das Objekt aber auf Bitebene verändern, um den Zähler zu erhöhen. Für sowas gibt's in C++ dann das Schlüsselwort mutable. Der zweite operator[] in deinem Beispiel oben könnte übrigens nicht einfach const gemacht werden, da in einer const Methode der this Pointer vom Typ const T* und nicht T* ist und die zurückgegebene Referenz dann automatisch auch const sein müsste. Außer du castest das const weg, in dem Fall gibt's dann aber wieder Potential für Undefined Behaviour, da die Methode dann auf einem const Objekt aufgerufen werden kann, welches über die zurückgegebene Referenz dann verändert werden könnte...

Und ja, an der Pointer-Arithmetik oder dass man beim Zugriff auf undefinierte Elemente einfach Speicher-Crap anstatt irgendeinem offensichtlichen Fehlverhalten zurückkriegt, habe ich mich auch schon gestört. Trotzdem sollte das doch immer funktionieren, weil die Pointer um sizeof(T) inkrementiert werden?!

Ja, es wird mit den Typen, die du für T einsetzen willst, unter allen mir bekannten Compilern auf x86 in der Regel tun was du willst. Dennoch ist es Undefined Behaviour... ;)

14

28.07.2013, 11:16

Dennoch ist es Undefined Behaviour... ;)
Daran erkennt man den besonders coolen und mutigen 1337-coder

(Link)

Werbeanzeige