gpt4 book ai didi

c++ - 从 noexcept 函数参数的构造函数中抛出的异常会立即导致对 std::terminate() 的调用吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:35:12 24 4
gpt4 key购买 nike

给定以下类声明:

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()

const phone_number phone("(123) 456-7890");

最佳答案

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

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

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... 并且程序正常退出。

关于c++ - 从 noexcept 函数参数的构造函数中抛出的异常会立即导致对 std::terminate() 的调用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36225823/

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