Спецификация исключений C ++ для перегрузки операторов iostream - PullRequest
2 голосов
/ 07 ноября 2019

Не указывается, если вызов ostream operator << </a> может завершиться с ошибкой или вызвать какое-либо исключение, и я никогда не сталкивался с этим.

  1. Есть ли случай, когда Оператор ostream << </a> может завершиться ошибкой?
  2. Если нет, почему стандарт не устанавливает спецификатор noexcept для этих перегрузок?
  3. Допустима ли следующая перегрузка? хорошая практика ? обычно используется?
  4. Тот же вопрос для оператора istream >> ?
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;
};

1 Ответ

6 голосов
/ 07 ноября 2019

Причина, по которой ни один из operator >> и operator << не помечен как noexcept, связана с std::basic_ios::exceptions. Эта функция-член присутствует во всех объектах, которые наследуются от std::basic_ios, и позволяет вам настроить поток для выдачи исключений для определенных режимов сбоя. Если бы операторы были noexcept, то вы не могли бы использовать их с потоком, для которого установлены исключения.

...