It is not specified if call to ostream operator<< can fail or throw any exception and I have never encounter this.
struct MyClass {
int data;
// I/O operators with noexcept specifier
friend std::istream& operator>>(std::istream &in, MyClass &obj) noexcept;
friend std::ostream& operator<<(std::ostream &out, const MyClass &obj) noexcept;
};
The reason none of the operator >>
and operator <<
are marked as noexcept
is because of std::basic_ios::exceptions
. This member function is present in all objects that inherit from std::basic_ios
and allows you to configure the stream to throw exceptions for certain failure modes. If the operators were noexcept
then you could not use them with a stream that has exceptions set.
The example is for std::iostream.
#include <iostream>
int main () {
std::cout.exceptions ( std::ios::failbit | std::ios::badbit );
try {
// operations with the stream ...
} catch (const std::ios::failure & ex) {
}
}
They generally can.
It is valid, but you must guarantee exceptions are not thrown out of them in fact. If an exception is attempted to be thrown out from the methods you provided, std::terminate will be called, since it is what happens for functions declared with noexcept when an exception is leaving them.
The same is for std::istream.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With