【问题标题】:Can the compiler decide the noexcept'ness of a function?编译器可以决定函数的 noexcept'ness 吗?
【发布时间】:2016-12-07 14:17:57
【问题描述】:

举个例子

class X
{
    int value;
public:
    X (int def = 0) : value (def) {}

    void add (int i)
    {
        value += i;
    }
};

显然,void X::add (int) 函数永远不会抛出任何异常。

我的问题是,即使函数没有标记为noexcept,编译器是否可以分析代码并决定不生成机器码来处理异常?

【问题讨论】:

  • 我很好奇,你为什么想(知道)这个?
  • 你有没有检查你的编译器生成的代码?
  • 可以,就像它可以判断一个函数是const还是constexpr。毕竟是编译器。它是否确实这样做以及它是否确实使用该信息是另一个问题。
  • “很明显,void X::add (int) 函数永远不会抛出任何异常。” -- 对于您和我正在使用的特定编译器来说可能是正确的,但如果某些编译器可以选择在有符号整数溢出时抛出异常,我不会感到惊讶。

标签: c++ compiler-construction noexcept


【解决方案1】:

如果编译器可以证明一个函数永远不会抛出异常,则“As-If”规则(C++ 标准的第 1.9 节,“程序执行”)允许删除处理异常的代码。

但是,不可能确定一个函数是否永远不会抛出一般情况,因为它相当于解决了停机问题。

【讨论】:

    猜你喜欢
    • 2021-02-16
    • 2011-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-16
    • 2012-01-17
    • 1970-01-01
    相关资源
    最近更新 更多