Wenn es um Konstruktoren geht, verhindert das Hinzufügen des Schlüsselworts explicit
, dass ein begeisterter Compiler ein Objekt erstellt, als es nicht die erste Absicht des Programmierers war. Gibt es einen solchen Mechanismus auch für Casting-Betreiber?
struct Foo
{
operator std::string() const;
};
Hier möchte ich zum Beispiel Foo
in ein std::string
, aber ich möchte nicht, dass eine solche Besetzung implizit auftritt.
Ja und nein.
Es hängt davon ab, welche Version von C++ Sie verwenden.
explicit
Beispiel,
struct A
{
//implicit conversion to int
operator int() { return 100; }
//explicit conversion to std::string
explicit operator std::string() { return "explicit"; }
};
int main()
{
A a;
int i = a; //ok - implicit conversion
std::string s = a; //error - requires explicit conversion
}
Kompiliere es mit g++ -std=c++0x
, erhalten Sie diesen Fehler:
prog.cpp: 13: 20: Fehler: Konvertierung von 'A' nach nicht skalarem Typ 'std :: string' angefordert
Online-Demo: http://ideone.com/DJut1
Aber sobald Sie schreiben:
std::string s = static_cast<std::string>(a); //ok - explicit conversion
Der Fehler verschwindet: http://ideone.com/LhuFd
Übrigens wird der explizite Konvertierungsoperator in C++ 11 als "Kontext-Konvertierungsoperator" bezeichnet, wenn er in Boolescher Wert konvertiert. Wenn Sie mehr über implizite und explizite Konvertierungen erfahren möchten, lesen Sie das folgende Thema:
Ich hoffe, das hilft.