Das Attribut [[noreturn]]
kann auf Funktionen angewendet werden, die nicht zurückgegeben werden sollen. Zum Beispiel:Überschreiben einer virtuellen Funktion [[noremore]]
[[noreturn]] void will_throw() { throw std::runtime_error("bad, bad, bad ...."); }
Aber ich folgende Situation erlebt habe (nein, ich habe dies nicht Design):
class B {
public:
virtual void f() { throw std::runtime_error(""); }
};
class D : public B {
void f() override { std::cout << "Hi" << std::endl; }
};
würde ich wirklich das Attribut [[noreturn]]
auf der B::f()
Erklärung platzieren möchte. Aber ich bin unklar, was mit der Überschreibung in der abgeleiteten Klasse passiert. Erfolgreiche Rückkehr von einer [[noreturn]]
Funktion führt zu undefiniertem Verhalten, und das will ich sicher nicht, wenn eine Überschreibung auch das Attribut erbt.
Die Frage: von [[noreturn] virtual void B::f()
überschreiben, tun erben ich das [[noreturn]]
Attribut?
Ich habe den C++ 14 Standard durchgesehen, und ich habe Probleme festzustellen, ob Attribute vererbt werden.
Ich weiß nicht, nur raten, aber an dem Punkt, wenn Sie B-> f() aufrufen, wird der Compiler höchstwahrscheinlich keine Ahnung haben, was der dynamische Typ von B ist, also denke ich, dass der Compiler mit noreturn optimieren wird. Ich weiß nicht, warum dieser Entwurf, wenn es, weil B keine Implementierung dafür hat und dieser Wurf ist ein Zeichen von "nenne das nicht, nur bei abgeleiteten Klassen" dann unterschreiben Sie es mit Noreturn macht keinen Sinn mir. (Nun, das Design selbst macht auch keinen Sinn.: D).Wenn Sie den statischen Typ von D verwenden, erwarte ich, dass der Compiler nicht zu noreturn optimiert wird. Nochmal: Ich rate es einfach. – Melkon
's/nicht zur Rückgabe eines Wertes/nicht zur Rückkehr gedacht /' –
@LightnessRacesinOrbit Thanks. Bearbeitetes orig. Post. – KyleKnoepfel