web-dev-qa-db-de.com

Kann ein Besetzungsoperator explizit sein?

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.

82
qdii

Ja und nein.

Es hängt davon ab, welche Version von C++ Sie verwenden.

  • C++ 98 und C++ 03 unterstützen keine Konvertierungsoperatoren vom Typ explicit
  • Aber C++ 11 tut es.

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.

99
Nawaz