Атрибут [[noreturn]]
может применяться к функциям, которые не предназначены для возврата. Например:Переопределение виртуальной функции [[noreturn]]
[[noreturn]] void will_throw() { throw std::runtime_error("bad, bad, bad ...."); }
Но я столкнулся со следующей ситуацией (нет, я не проектировал это):
class B {
public:
virtual void f() { throw std::runtime_error(""); }
};
class D : public B {
void f() override { std::cout << "Hi" << std::endl; }
};
Я бы очень хотел, чтобы поместить атрибут [[noreturn]]
на B::f()
декларации. Но я не понимаю, что происходит с переопределением в производном классе. Успешное возвращение из функции [[noreturn]]
приводит к неопределенному поведению, и я, конечно, не хочу этого, если переопределение также наследует атрибут.
Вопрос: Переопределелив [[noreturn] virtual void B::f()
, я наследовать атрибут [[noreturn]]
?
Я просмотрел стандарт C++ 14, и у меня возникли проблемы с определением того, наследуются ли атрибуты.
Я не знаю, просто догадываясь, но в тот момент, когда вы вызываете B-> f(), компилятор, скорее всего, не будет знать, что такое динамический тип B, поэтому я думаю, что компилятор будет оптимизирован с помощью noreturn. Я не знаю, почему этот дизайн, если это потому, что у B нет реализации для этого, и этот бросок является признаком «не называйте это, только на производных классах», а затем подпишите его с помощью noreturn, не имеет смысла мне. (ну, сам дизайн также не имеет большого смысла.: D).Если вы используете статический тип D, я ожидаю, что компилятор не будет оптимизирован для noreturn. Опять же: я просто догадываюсь. – Melkon
's/не предназначен для возврата значения/не предназначен для возврата вообще /' –
@LightnessRacesinOrbit Спасибо. Отредактированный оригинал. после. – KyleKnoepfel