iostream 运算符重载的 C++ 异常规范

C++ exception specification for iostream operator overloading

未指定调用 ostream operator<< 是否会失败或抛出任何异常,我从未遇到过这种情况。

  1. 是否存在 ostream operator<< 可能失败的情况?
  2. 如果不是,为什么标准不对这些重载添加 noexcept 说明符?
  3. 以下重载有效吗?好的做法?常用 ?
  4. 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,那么您不能将它们用于设置了异常的流。

  1. 它可能会失败,您可以使用 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) {

    }
 
}
  1. 他们通常可以。

  2. 是有效的,但是你必须保证它们实际上没有抛出异常。如果试图从您提供的方法中抛出异常,将调用 std::terminate,因为当异常离开它们时,用 noexcept 声明的函数会发生这种情况.

  3. std::istream也是如此。