c++ noexcept

文章探讨了C++中noexcept关键字的作用,包括用于声明函数不会抛出异常、阻止异常传播以及在表达式中检查异常的可能性。通过示例展示了当noexcept函数抛出异常时,编译器将终止程序,以及如何影响异常传播行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <iostream>

// 1.noexcept修饰函数表示不会有异常,若修饰过函数抛出异常,编译器会使用std::terminate()
// 来立即终止程序运行

// 抛出异常
auto may_throw() {
    throw true;
}

// noexcept修饰函数, 等价noexcept(true), noexcept(false)-和不加noexcept等价
auto no_throw() noexcept{
    return;
}

auto may_block_throw=[](){
     may_throw();
};

auto no_block_throw=[]() noexcept{
     no_throw();
};

// 2.使用noexcept修饰表达式,当表达式无异常则返回true,否则false;
void Test(){
    std::cout<<std::boolalpha;
    std::cout<< noexcept(may_throw())<<std::endl; // false
    std::cout<< noexcept(no_throw())<<std::endl;  // true
    std::cout<< noexcept(may_block_throw())<<std::endl; // false
    std::cout<< noexcept(no_block_throw())<<std::endl; // true
}

// 3. noexcept 修饰完一个函数之后能够起到封锁异常扩散的功效,如果内部产生异常,外部也不会触发
auto func1=[]() noexcept{
    may_throw();
};

auto func2=[](){
    may_throw();
};

void Test1(){
    
    // try{
    //     func1(); // func1中may_throw函数抛出异常,func1被noexcept修饰后会terminate
    // }
    // catch(...) {
    //     std::cout<<"B throw"<<std::endl; // should be not here
    // }

    
    try{
        func2(); // func2中may_throw函数抛出异常,func2也会抛出异常,这就是异常扩散
    }
    catch(...) {
        std::cout<<"func2 throw"<<std::endl; // should be  here
    }
    
}
int main()
{
    Test1();
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值