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

benötigt wird
#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.

  1. Kann jemand etwas Licht auf, was Wirkung const hat auf implizite Konvertierungen?
  2. Ist die Verwendung von const die Umwandlung machen „ohne jeden Zweifel“ pro 12,3 Linie 2?
  3. Does const irgendwie beeinflussen lvalue gegen rvalue darüber gesprochen, in Abschnitt 4?
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top