Lorenzo Caminiti wrote:
read() can fail, so you can drop its "valid" precondition and just fail when the handle is invalid.
Calling read() on a moved-from object so violating its is_valid() precondition is a bug, not a run-time error while reading the file. The precondition legitimately remains in place to catch bugs, even after it is noted that read() can fail because of file-system or other run-time errors.
On one hand, you want to have a precondition. On the other, you say that if you have the precondition, the class would be crippled and not very useful:
2. How useful is a class like the one above with "crippled" invariants and is_valid() preconditions on all its useful public methods like read()? The answer seems to be: not very useful.
These are contradictory. Either the class that has preconditions is crippled and not very useful, in which case we drop the preconditions as I suggest; or it's useful, in which case we keep them.