我制作了一个自定义流类型,称为它error_stream
,它派生自std::ostringstream
. 我还为名为throw_cpp_class
(throw_cpp
的实例throw_cpp_class
) 的流制作了一个自定义操纵器。我的目标是拥有这种语法:
error_stream s;
s << "some error " << message() << throw_cpp; // throw_cpp throws an exception containing contents of the stream.
我发现,通过定义一个插入操作符,它将对流的右值引用作为第一个操作数,我现在可以这样做:
error_stream() << "some error " << message() << throw_cpp;
插入运算符如下所示:
error_stream& operator<<(error_stream&& s, const throw_cpp_class&)
{
throw s.str();
return s;
}
这里发生了什么?为什么我可以返回需要error_stream&&
an的类型的值error_stream&
?(这会调用移动构造函数吗?)。这是非常低效的吗?(考虑到例外情况应该很少见,我并不是真的在乎)。