给定以下类声明:
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");
发布于 2016-03-26 02:48:13
由于所有参数都是在调用函数之前计算的,因此由参数的构造函数发出的异常不会违反函数本身的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...
,程序正常退出。
https://stackoverflow.com/questions/36225823
复制相似问题