gpt4 book ai didi

c++ - 覆盖 [[noreturn]] 虚函数

转载 作者:IT老高 更新时间:2023-10-28 21:47:50 25 4
gpt4 key购买 nike

[[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 标准,但无法确定属性是否被继承。

最佳答案

我已经阅读了标准,没有迹象表明具体的 [[noreturn]] 或更一般的属性是通过覆盖函数“继承”的。

很难证明是否定的,而且标准实际上并没有声明这一点,但是,因为 A::f()B::f() 仍然是不同的函数,并且描述的唯一行为是根据函数定义的,我认为您可以安全地将 A::f() 标记为 [[noreturn]].

话虽如此,考虑到动态调度,我无法想象编译器随后会执行哪些有用的优化。

关于c++ - 覆盖 [[noreturn]] 虚函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32655526/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com