给定以下类声明:
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 ) }
{
}
std::terminate()
如果从字符串构造函数引发异常,那么由于noexcept规范,以下代码行是否最终会立即调用?
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...
,程序正常退出。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句