请考虑以下代码:
throw my_exception() << "The error " << error_code << " happened because of " << reasons;
支持代码如下:
class my_exception
{
public:
template <typename T>
my_exception & operator << (const T & value)
{
// put the value somewhere
return *this;
}
// etc.
};
与下面的替代方案相比,是否有任何理由会导致这种throw
危险或效率低下?
std::stringstream s;
s << "The error " << error_code << " happened because of " << reasons;
throw my_exception(s.str());
答案 0 :(得分:4)
您通过多个函数调用(operator<<
重载)构造异常对象,所有这些都在抛出异常之前发生。这与正常的程序执行没什么不同。
唯一可能的问题是,如果异常对象构建中的某些内容抛出(例如,如果没有足够的内存可用于保存构建的错误字符串),则可以抛出不同的异常。
所以这样做没有任何本质上的危险。