“virtual const char* ro_err::StdErr::what() const”的抛出说明符更宽松了。”

6

这是我的完整代码,我自定义了一些异常:

class StdErr : public std::exception {

public:
    str msg;

    StdErr(str msg) { this->msg = msg; };

    virtual const char *what() const override {
        return this->msg.c_str();
    };
};

并且可以像这样继承它:

class ShErr : public StdErr {

public:
    ShErr(str m) : StdErr(m) { }
};

并像这样使用它们:

int main(int argc, char **argv) {
    throw ro_err::ShErr("sh err");
    return (0);
};

出现了以下错误:looser throw specifier for ‘virtual const char* ro_err::StdErr::what() const’,我有以下问题:

  • 什么是“looser”?
  • 什么是“specifier”?
  • 如何修复这个错误?
注:该内容保留了HTML标签。
1个回答

15
自 C++11 起,what() 已经是 noexcept 了。您没有将其声明为 noexcept。这就是“较松散的异常说明符”提示您的原因。请参见http://en.cppreference.com/w/cpp/error/exception/what
换句话说,请像这样声明:
virtual const char *what() const noexcept override

"looser" 是什么意思? - chikadance
@asullaherc 这是一个更宽松的throw规范定义。如果没有它,what()可以抛出异常。 - Captain Giraffe
除非您仍然想覆盖此方法,否则不需要使用虚拟。 - Paweł Iwaneczko
@PawełIwaneczko 在继承类中省略虚拟关键字对代码行为没有任何影响。也就是说,它仍然可以被覆盖。 - Captain Giraffe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接