Warum für implizite Konvertierung const?
-
29-09-2019 - |
Frage
Nach umfangreichen Lesen von ISO / IEC 14882, Programmiersprache - C ++ ich bin immer noch nicht sicher, warum const
für implizite Konvertierung in einen benutzerdefinierten Typ mit einem einzigen Argumente Konstruktor wie folgt
#include <iostream>
class X {
public:
X( int value ) {
printf("constructor initialized with %i",value);
}
}
void implicit_conversion_func( const X& value ) {
//produces "constructor initialized with 99"
}
int main (int argc, char * const argv[]) {
implicit_conversion_func(99);
}
Beginnend mit Abschnitt 4, Zeile 3
Ein Ausdruck e kann implizit in einem Typ T umgewandelt werden, wenn und nur wenn die Erklärung T t = e; wohlgeformt ist, für einige temporäre Variable t erfunden (8.5). Bestimmte Sprachkonstrukte erfordern, dass ein Ausdruck auf einen booleschen Wert umgewandelt werden. Ein Ausdruck e in einem solchen Kontext erscheint, wird gesagt, kontextuell zum bool umgewandelt werden und wohlgeformt ist, wenn und nur wenn die Erklärung bool t (e); wohlgeformt ist, für einige temporäre Variable t erfunden (8.5). Die Wirkung von entweder implizit Umwandlung ist das gleiche wie die Deklaration und die Initialisierung durchführt und dann unter Verwendung der temporären Variablen, die als Ergebnis der Umwandlung. Das Ergebnis ist ein L-Wert, wenn ein L-Wert T Referenztyp (8.3.2) und ein R-Wert anders ist. Der Ausdruck e wird als L-Wert verwendet, wenn und nur wenn die Initialisierung es als L-Wert verwendet wird.
Im Anschluss an, dass ich den Abschnitt über initializers gefunden in 8,5 Linie im Zusammenhang mit Arten benutzerdefinierten 6
Wenn ein Programmaufruf für die Standard-Initialisierung eines Objekts einer const qualifizierten Typs T, T ist ein Klassentyp mit einem vom Benutzer bereitgestellte Standardkonstruktor sein.
Schließlich landete ich bei 12,3 Linie 2 über benutzerdefinierte Konvertierungen auf welche Staaten
Benutzerdefinierte Konvertierungen werden nur dort eingesetzt, wo sie eindeutig sind (10.2, 12.3.2).
Unnötig zu sagen, 10.2 und 12.3.2 haben meine Frage nicht beantwortet.
- Kann jemand etwas Licht auf, was Wirkung
const
hat auf implizite Konvertierungen? - Ist die Verwendung von
const
die Umwandlung machen „ohne jeden Zweifel“ pro 12,3 Linie 2? - Does
const
irgendwie beeinflussen lvalue gegen rvalue darüber gesprochen, in Abschnitt 4?
Lösung
Es hat nicht wirklich viel mit der Umwandlung Wesen impliziter zu tun. Darüber hinaus ist es nicht wirklich viel zu tun hat, mit Conversions . Es ist wirklich über rvalues ?? vs. lvalues ??.
Wenn Sie 99
zu Typ X
konvertieren, ist das Ergebnis eine rvalue . In C ++ Ergebnisse von Umwandlungen sind immer rvalues ??(es sei denn, Sie zu Referenztyp umwandeln). Es ist illegal, in C ++ nicht-const Verweise auf rvalues ??zu befestigen.
Zum Beispiel dieser Code nicht kompiliert
X& r = X(99); // ERROR
da wird versucht, eine nicht konstante Referenz auf einen R-Wert zu befestigen. Auf der anderen Seite, dieser Code ist in Ordnung
const X& cr = X(99); // OK
, weil es vollkommen in Ordnung ist, eine konstante Referenz auf einen R-Wert zu befestigen.
Das gleiche geschieht auch in Ihrem Code. Die Tatsache, dass es eine implizite Konvertierung beinhaltet ist irgendwie nebensächlich. Sie können implizite Konvertierung mit einer expliziten ersetzen ein
implicit_conversion_func(X(99));
und mit der gleichen Situation am Ende: mit const
es kompiliert, ohne const
tut es nicht.
Auch die einzige Rolle, die Umwandlung (explizit oder implizit) spielt hier ist, dass es uns eine rvalue zu produzieren hilft. In der Regel können Sie ein R-Wert auf andere Weise und laufen in der gleichen Ausgabe erzeugen
int &ir = 3 + 2; // ERROR
const int &cir = 3 + 2; // OK
Andere Tipps
Pro Abschnitt 5.2.2 Absatz 5, wenn ein Argument eine Funktion von const
Referenztyp ist, wird eine temporäre Variable automatisch bei Bedarf eingeführt. In Ihrem Beispiel hat das rvalue Ergebnis X(99)
in eine temporäre Variable gesetzt werden, so dass dieser Variable kann durch const
Bezug auf implicit_conversion_func
weitergegeben werden.