Ja, das ist beabsichtigt, und die Möglichkeit eines Bruchs, wenn überlastet ist, ist bekannt.
Die Übernahme der Adresse unvollständiger Typen ist schon lange vor C++ möglich. In C besteht absolut keine Bruchgefahr, da &
nicht überlastet werden kann.
C++ entschied sich, die zuvor gültigen Programme nicht unnötig zu unterbrechen, und spezifizierte einfach, dass wenn ein unvollständiger Typ sich als überladener &
-Operator herausstellt, es nicht spezifiziert ist, ob der überladene Operator verwendet wird.
Zitiert N4140:
5.3.1 Unäre Operatoren [expr.unary.op]
Wenn &
zu einem L-Wert von unvollständigem Klassentyp und dem vollständigen Typ operator&()
erklären sie angewandt wird, ist nicht spezifiziert, ob der Operator die eingebaute Bedeutung hat oder die Operatorfunktion aufgerufen wird.
Dies interpretiert werden kann, auch zu einer Klasse gilt zur Zeit, erklärt zu werden und selbst wenn eine Erklärung von operator&
bereits gesehen hat:
extern struct A a;
struct A {
int operator&();
decltype(&a) m; // int, or A *?
};
int main() {
return A().m; // only valid if m is int
}
Hier gibt GCC m
Typen A *
und das Programm ablehnt , aber Klang gibt es Typ int
und akzeptiert es.
Ich denke, die bessere Frage ist "Warum erlaubt C++ das Überladen von' & 'an erster Stelle": D –
Ich hatte keine Ahnung, dass Sie 'Operator &()' überladen könnten. Manchmal denke ich, C++ lässt Entwickler zu * zu viel *. – tenfour
@tenfour: Ich kann buchstäblich nur an eine Situation denken, in der es nützlich ist, und das ist, wenn * die Adresse der Operation in Lambda-Notation, z. 'foo [& _ 1]'. – Mehrdad