Ich habe eine Ausnahmeklasse wie folgt:
#include <exception>
struct InvalidPathException : public std::exception
{
explicit InvalidPathException() {}
const char* what() const;
};
const char*
InvalidPathException::what() const {
return "Path is not valid";
}
Beim Kompilieren unter GCC 4.4 mit -Wall -std=c++0x
Fehler: lockerer throw specifier für 'virtual const char* InvalidPathException::what() const'
Fehler: Überschreiben von 'virtual const char* std::exception::what() const throw ()'
Das ist auch richtig so, denn ich überschreibe std::exception
's what()
Methode, die tatsächlich eine throw()
Ausnahmebezeichner. Da man aber oft informiert sein sollten wir keine Ausnahmespezifizierer verwenden. Und so wie ich es verstehe, sind sie veraltet in C++11 , aber offensichtlich noch nicht im GCC mit -std=c++0x.
Deshalb würde mich interessieren, wie man jetzt am besten vorgeht. In dem Code, den ich entwickle, ist mir die Leistung wichtig und ich mache mir Sorgen über den oft erwähnten Overhead von throw()
aber ist dieser Aufwand in Wirklichkeit so groß? Liege ich richtig in der Annahme, dass ich sie nur erleiden würde, wenn what()
tatsächlich aufgerufen wird, was erst nach dem Auslösen einer solchen Ausnahme der Fall wäre (und ebenso für die anderen von std::exception geerbten Methoden, die alle über throw()
Spezifizierer)?
Alternativ gibt es eine Möglichkeit, um diesen Fehler von GCC gegeben zu arbeiten?