首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从noexcept函数参数的构造函数抛出的异常是否会立即导致对std::terminate()的调用?

从noexcept函数参数的构造函数抛出的异常是否会立即导致对std::terminate()的调用?
EN

Stack Overflow用户
提问于 2016-03-26 02:33:59
回答 1查看 708关注 0票数 5

给定以下类声明:

代码语言:javascript
复制
class phone_number
{
public:
    explicit phone_number( std::string number ) noexcept( std::is_nothrow_move_constructible< std::string >::value );
}

phone_number::phone_number( std::string number ) noexcept( std::is_nothrow_move_constructible< std::string >::value )
    : m_originalNumber{ std::move( number ) }
{

}

如果字符串构造函数抛出异常,下面这行代码会不会由于noexcept规范而立即调用std::terminate()

代码语言:javascript
复制
const phone_number phone("(123) 456-7890");
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-26 02:48:13

由于所有参数都是在调用函数之前计算的,因此由参数的构造函数发出的异常不会违反函数本身的noexcept约定。

为了证实这一点,下面是我尝试过的,近似于您的示例:

代码语言:javascript
复制
class A
{
public:
    A(const char *)
    {
        throw std::exception();
    }
};

void f(A a) noexcept
{

}

int main()
{   
    try
    {
        f("hello");
    }
    catch(std::exception&)
    {
        cerr<< "Fizz..." << endl;
    }
    return 0;
}

不出所料,输出为Fizz...,程序正常退出。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36225823

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档