【发布时间】:2015-12-15 19:26:30
【问题描述】:
[[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 没有对此的实现,并且此 throw 是“不要调用它,仅在派生类中”的标志,那么用 noreturn 对其进行签名没有意义对我来说。 (嗯,设计本身也没有多大意义。:D)。如果您使用 D 的静态类型,我希望编译器不会优化到 noreturn。再说一遍:我只是猜的。
标签: c++ c++11 inheritance noreturn