Reputation: 2121
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;
};
Upvotes: 6
Views: 1109
Reputation: 677
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.
Upvotes: 2
Reputation: 180660
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.
Upvotes: 8