Я сравниваю два класса, потому что они оба ассоциируются с чем-то другим. std::basic_fstream
должен ассоциироваться с файлом, в то время как std::unique_lock
должен ассоциироваться с мьютексом. Таким образом, обеспечивая open()
метод кажется разумным. Еще, std::unique_lock
не предоставляет таких методов. Ленивая инициализация может быть выполнена в любом случае через назначение перемещения. Таким образом, может показаться излишним open()
метод. std::basic_fstream
с другой стороны, обеспечивает open()
метод. std::basic_fstream
существует до C ++ 11, и тогда это единственный способ выполнить отложенную инициализацию. Оставляя в стороне соображения обратной совместимости, std::basic_fstream::open()
просто быть удаленным? Или это все еще должно быть там, чтобы операция могла провалиться на самом деле? Обратите внимание, что операция открытия (связывания) всегда завершается успешно std::unique_lock
(не путать с операцией блокировки).
Ваше последнее предложение фактически содержит подсказку:open
(ассоциированная) операция всегда завершается успешно std::unique_lock
Msgstr «Это позволяет объявить open-ness как инвариант класса, установить его в конструкторе и генерировать исключения при редких сбоях. По сравнению с файлами: их открытие может и не получится, поэтому объявление open как инварианта класса не делает» там тоже не работает.
Других решений пока нет …