gpt4 book ai didi

c++ - 在什么情况下 C++ 编译器会推断出 noexcept?

转载 作者:可可西里 更新时间:2023-11-01 15:23:55 27 4
gpt4 key购买 nike

假设 C++ 编译器正在编译一个函数,该函数的定义在与其调用相同的翻译单元中可用。假设它既不抛出自身也不调用已知抛出的函数。还假设没有调用 extern C 代码,也没有调用具有潜在零值的数字除法。

在这些假设下,编译器会将函数视为noexcept吗?如果不是,是否还有其他条件可以推断出 noexcept

具体来说,像

这样的 super 简单的函数呢?
void foo() { } /* this one */
class A {
int x_;
public:
x() const { return x_; } /* ... and this one */
}

?

我想要一个仅基于标准的答案,最重要的是,也可能是 GCC 和 clang 所做的。

最佳答案

除非您明确使用 noexcept 说明符,否则几乎所有函数都被假定为可能会抛出异常。异常(exception)是您自己定义的 delete(释放函数)和一些特殊的成员函数:构造函数、析构函数和赋值运算符。 (C++17)

来自 [except.spec]

If a declaration of a function does not have a noexcept-specifier, the declaration has a potentially throwing exception specification unless it is a destructor or a deallocation function or is defaulted on its first declaration, in which cases the exception specification is as specified below and no other declaration for that function shall have a noexcept-specifier.

构造函数

是隐式的 noexcept 除非对任何成员(或成员的成员等)执行的任何初始化都可能抛出

析构函数

隐式为 noexcept 除非潜在构造的子对象的任何析构函数可能抛出。

赋值运算符

是隐含的 noexcept 除非在其中使用赋值是潜在的抛出。


下面是演示上述内容的一些示例代码(clang 6.0.0gcc 8.0.0):

int foo() { return 1; }
int bar() noexcept{ return 1; }

struct Foo{};

struct Bar{
Bar(){}
};

int main()
{
static_assert(noexcept(bar()));
static_assert(!noexcept(foo()));
static_assert(noexcept(Foo()));
static_assert(noexcept(Foo().~Foo()));
static_assert(noexcept(Foo().operator=(Foo())));
static_assert(!noexcept(Bar()));
Bar b;
static_assert(noexcept(b.~Bar()));
}

使用 =default 或允许编译器通过省略生成自己的特殊成员函数版本的另一个原因。

关于c++ - 在什么情况下 C++ 编译器会推断出 noexcept?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47266148/

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