2017-05-02 4 views
0

Ich schreibe Code, der meine Caching-Ausnahme erfordert.Implizite Konvertierung in bool für std :: exeption_ptr

Bitte beachten Sie

int main() 
{ 
    std::exception_ptr ex; 
    bool b = ex; 
} 

Dies lässt sich nicht kompilieren aufgrund ex nicht auf einen Typ bool umwandelbar. Meine aktuelle Problemumgehung ist

bool b = !!ex; 

oder sogar

bool b = ex ? true : false; 

Der erste Weg ist hässlich, die zweite eine Tautologie sicher zu schreiben. Ich fange an, den Compiler zu beschuldigen (MSVC2015). Zwei Dinge:

  1. Gibt es eine bessere Art und Weise der Überprüfung, ob ex hat eine Ausnahme gesetzt?

  2. (Verbunden) Muss ich in irgendeiner Weise ex initialisieren?

+0

@Downvoter: Es tut mir leid, wenn diese Frage Sie beleidigt. Wenn es einen Weg gibt, wie ich dich beschwichtigen kann, dann teile bitte deine Weisheit. –

+0

Haben Sie die Dokumentation gelesen? http://en.cppreference.com/w/cpp/error/exception_ptr – NathanOliver

+0

Ja habe ich.Aber ich verstehe nicht, warum '' 'zusammen mit der Bedingung funktioniert. Was vermisse ich? –

Antwort

2

the documentation lesen.

Die implizite Konvertierung ist verboten, eine explizite Konvertierung jedoch nicht.

std :: exception_ptr ist nicht implizit in Arithmetik-, Enumerations- oder Zeigertypen konvertierbar. Es ist kontextuell in bool umwandelbar und wird zu false ausgewertet, wenn es null ist, ansonsten wahr.

So funktioniert es, wenn Sie explizit den Ausdruck konvertieren, aber nicht, wenn Sie so implizit versuchen zu tun, das heißt in der boolcopy-Initialisierung.

Eine bessere Lösung ist die bool direkt zu initialisieren:

bool b{ex}; 

Ihre P45 ist in der Post; Hoffentlich werden Sie in Ihrem nächsten Job die Dokumentation konsultieren. ;)

+0

Zur Klarstellung, die Syntax 'bool b {ex}' ist in diesem Fall die gleiche wie 'bool b (ex)' und sogar 'bool b = static_cast (ex);'. Im Kern rufen alle von ihnen den Konvertierungsoperator "explicit operator bool()" für die Klasse exception_ptr auf. – Johannes

+0

@Johannes: Gleiches Ergebnis. Technisch nicht äquivalente Funktionalität. –

1

Der Typ std::exception_ptr ist ein NULL-Zeichen, was bedeutet, dass standardmäßig ein NULL-Wert erstellt wird, wenn er standardmäßig erstellt wird. Da dies ein typedef ist und nicht notwendigerweise ein roher Zeiger ist, kann er nicht direkt einem Bool zugewiesen werden, da dies den Typ implizit konvertieren würde.

Sie können prüfen, ob sie gesetzt wurde, wie Sie getan haben, oder Sie können so etwas tun sauber nullptr durch die Verwendung oder explizit in einen Booleschen Casting:

std::exception_ptr e; 
bool isNull = false; 

if(e == nullptr) 
    isNull = true; 

Explicit Casting:

std::exception_ptr e; 
bool isNull = static_cast<bool>(e);