Boost Variante mehrdeutige Konstruktion [duplizieren]

8

Die Dokumentation zu Boost Variant sagt Folgendes über den Konstruktor, der einen beliebigen Typ akzeptiert:

%Vor%
  • Erfordert: T muss eindeutig in einen der beschränkten Typen konvertierbar sein (d. h. T1, T2 usw.).

Das Gleiche gilt für die Konstruktoren, die const T& und T&& akzeptieren. Also ich erwarte, dass der folgende Code nicht kompiliert:

%Vor%

Aber der Code kompiliert und v wird zu einem bool, was ich definitiv nicht wollte. Natürlich besteht die Lösung darin, das String-Literal in einen std::string -Konstruktor zu schreiben. Meine Frage ist:

  1. Warum kompiliert dieser Code?
  2. Wie wird der Typ ausgewählt (da const char* sowohl in std::string als auch in bool konvertierbar ist)?
petersohn 12.09.2014, 07:21
quelle

1 Antwort

2

Im Allgemeinen verlieren benutzerdefinierte Conversions den Prozess der Überladungsauflösung in Standardkonvertierungen.

Es gibt eine integrierte Konvertierung von const char pointers nach bool , was gegenüber der nicht integrierten Konvertierung von const char * in std::string bevorzugt ist (zB siehe Implizite Conversions ).

std::string ist, obwohl es sich um einen Teil der Standardbibliothek handelt, kein eingebauter Typ, daher werden seine Konvertierungskonstruktoren nur nach Konvertierungen in integrierte Typen berücksichtigt.

Einige Referenzen:

manlio 12.09.2014, 09:24
quelle

Tags und Links