iostream 运算符重载的 C++ 异常规范
C++ exception specification for iostream operator overloading
未指定调用 ostream operator<< 是否会失败或抛出任何异常,我从未遇到过这种情况。
- 是否存在 ostream operator<< 可能失败的情况?
- 如果不是,为什么标准不对这些重载添加 noexcept 说明符?
- 以下重载有效吗?好的做法?常用 ?
- istream operator>> 的相同问题?
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;
};
operator >>
和operator <<
的none之所以标记为noexcept
是因为std::basic_ios::exceptions
。此成员函数存在于从 std::basic_ios
继承的所有对象中,并允许您配置流以针对某些故障模式抛出异常。如果运算符是 noexcept
,那么您不能将它们用于设置了异常的流。
- 它可能会失败,您可以使用 return 值来了解结果,也可以使用 std::ostream::exceptions 方法启用异常。
示例适用于 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) {
}
}
他们通常可以。
是有效的,但是你必须保证它们实际上没有抛出异常。如果试图从您提供的方法中抛出异常,将调用 std::terminate,因为当异常离开它们时,用 noexcept 声明的函数会发生这种情况.
std::istream也是如此。
未指定调用 ostream operator<< 是否会失败或抛出任何异常,我从未遇到过这种情况。
- 是否存在 ostream operator<< 可能失败的情况?
- 如果不是,为什么标准不对这些重载添加 noexcept 说明符?
- 以下重载有效吗?好的做法?常用 ?
- istream operator>> 的相同问题?
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;
};
operator >>
和operator <<
的none之所以标记为noexcept
是因为std::basic_ios::exceptions
。此成员函数存在于从 std::basic_ios
继承的所有对象中,并允许您配置流以针对某些故障模式抛出异常。如果运算符是 noexcept
,那么您不能将它们用于设置了异常的流。
- 它可能会失败,您可以使用 return 值来了解结果,也可以使用 std::ostream::exceptions 方法启用异常。
示例适用于 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) {
}
}
他们通常可以。
是有效的,但是你必须保证它们实际上没有抛出异常。如果试图从您提供的方法中抛出异常,将调用 std::terminate,因为当异常离开它们时,用 noexcept 声明的函数会发生这种情况.
std::istream也是如此。