我做了一個自定義流類型,稱之爲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&&
類型的值,其中error_stream&
是必需的? (這是否調用移動構造函數?)。這是非常低效的嗎? (不是我真的很在意,因爲這個例外應該很少見)。
這實際上是一種整潔......我想我可能更喜歡'throw_cpp',但是要拋出該錯誤與流的內容。 –
我會放棄返回類型和'return os'語句。寫'<<某個錯誤'<< message()<< throw_cpp <<「更多」;''是一個語義錯誤。通過返回'void',它也會變成一個語法錯誤,編譯器會抓住它。 – MSalters
@ MSalters - 好點。我做了改變。 – 0xbe5077ed