L'attributo [[noreturn]]
può essere applicato a funzioni che non sono destinate a restituire. Per esempio:Sovrascrittura di una funzione virtuale [[Noreturn]]
[[noreturn]] void will_throw() { throw std::runtime_error("bad, bad, bad ...."); }
Ma ho incontrato la seguente situazione (no, non ho progettare questo):
class B {
public:
virtual void f() { throw std::runtime_error(""); }
};
class D : public B {
void f() override { std::cout << "Hi" << std::endl; }
};
mi piacerebbe davvero per posizionare l'attributo [[noreturn]]
nella dichiarazione B::f()
. Ma non sono chiaro su cosa succede all'override nella classe derivata. Il ritorno con successo da una funzione [[noreturn]]
ha come risultato un comportamento indefinito, e certamente non voglio che se una sovrascrittura erediti anche l'attributo.
La domanda: Con l'override [[noreturn] virtual void B::f()
, faccio io eredito l'attributo [[noreturn]]
?
Ho esaminato lo standard C++ 14 e ho difficoltà a determinare se gli attributi sono ereditati.
Non lo so, sto solo supponendo ma al punto in cui si chiama B-> f() il compilatore molto probabilmente non avrà idea di quale sia il tipo dinamico di B, quindi penso che il compilatore ottimizzerà con noreturn. Non so perché questo disegno, se è perché B non ha un'implementazione per questo e questo lancio è un segno di "non chiamare questo, solo nelle classi derivate" quindi firmarlo con noreturn non ha senso per me. (beh, anche il design non ha molto senso.: D).Se si utilizza il tipo statico di D, mi aspetto che il compilatore non ottimizzi il noreturn. Ancora: lo indovino. – Melkon
's/non significava restituire un valore/non intendeva restituire affatto /' –
@LightnessRacesinOrbit Grazie. Origitato modificato inviare. – KyleKnoepfel