C++ noexcept关键字

noexcept简介

noexcept有两个作用,一是作为说明符,用来说明函数是否跑出异常,一是运算符,能够判断函数是否有声明不会抛出异常。

说明符举例:

int f() noexcept { return 1; }

运算符举例:

int g() noexcept(f()) { return 2; }

noexcept解决移动构造问题

如果在移动构造时发生了异常,则将会发生很严重的错误,原本的数据也不可用,因此,我们需要保证移动构造的时候不抛出异常。如果函数没有抛出异常的可能,则函数可以使用移动构造,反之,则使用复制构造。

下面的代码是一个强制开发者实现类型T的移动操作的交换值函数

如果类型T的 移动构造和移动赋值函数会抛出异常,则会编译失败,这样让写类型T的开发者强制实现不抛出异常的移动函数。

template<class T>
void Swap(T& a, T& b) noexcept(noexcept(T(std::move(a))) && noexcept(a.operator=(std::move(b))))
{
    static_assert(noexcept(T(std::move(a))) && noexcept(a.operator=(std::move(b))));

    T t(std::move(a));
    a = std::move(b);
    b = std::move(tmp);
}

也可以通过判断的方法,来动态的进行调用,如果移动操作抛出异常,则使用复制操作。

template<class T>
void Swap(T& a, T& b, std::integral_constant<bool, true>) noexcept
{
    T t(std::move(a));
    a = std::move(b);
    b = std::move(tmp);
}

template<class T>
void Swap(T& a, T& b, std::integral_constant<bool, false>) noexcept
{
    T t(a);
    a = b;
    b = t;
}

template<class T>
void Swap(T& a, T& b)
noexcept(noexcept(Swap(a,b,std::integral_constant<bool,noexcept(T(std::move(a))) && noexcept(a.operator=(std::move(b)))>())))
{
    Swap(a, b, std::integral_constant<bool, noexcept(T(std::move(a))) && noexcept(a.operator=(std::move(b)))>());
}

对于throw

在C++17中,throw是noexcept的别名,而在C++20,throw被移除

默认带有noexcept的函数

默认构造函数、默认复制构造函数、默认赋值函数、默认移动构造函数和默认移动赋值函数。

析构函数,delete运算符默认带有noexcept。

注意:自己实现的析构函数带有noexcept,但是构造函数这些则相反,自定义实现不带有noexcept。

使用场景

下面这些情况下可以使用noexcept:

一定不会出现异常的函数

当目标是提供不会抛出异常的函数

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
noexcept关键字C++11中引入的,用于指明某个函数不会抛出异常。在函数声明或定义时使用noexcept关键字可以明确表示该函数不会抛出任何异常。noexcept关键字有两种形式,一种是直接在函数声明后加上noexcept关键字,例如"void test() noexcept;",另一种是使用noexcept作为操作符,通常用于模板。例如"template <class T> void fun() noexcept(noexcept(T())) {}"。 使用noexcept关键字可以提供更好的代码可读性和性能优化。在函数声明或定义中使用noexcept关键字可以帮助程序员更加清晰地了解函数的异常安全性,并在编译时进行一些优化。当一个函数被声明为noexcept时,编译器可以在编译时对其进行一些优化,提高代码的执行效率。 需要注意的是,noexcept并不会禁止函数抛出异常,而是用来明确表示函数不会抛出异常。如果一个被声明为noexcept的函数在运行时抛出异常,程序将会终止。因此,在使用noexcept关键字时要确保函数的实现没有抛出异常的可能性。 总之,noexcept关键字C++11引入的用于指明某个函数不会抛出异常的关键字,可以提高代码的可读性和性能优化。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [c++中的noexcept 关键字](https://blog.csdn.net/weixin_68294039/article/details/127023089)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [C++ vector扩容解析noexcept应用场景](https://download.csdn.net/download/weixin_38514805/13707167)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值