Use namespace aliases to save typing, and to allow dropping in alternative implementations
of a library namespace, such as Boost.
std::error_code provides a very neat way to pass integer error codes up the stack without exception handling; consider using it if you work in a domain where exception handling is frowned upon. (In which case, that is likely all you will be able to take away from this particular chapter! The <filesystem> library provides both throwing and non-throwing APIs; however, both APIs use the heap-allocating (and, potentially, throwing fs::path as a vocabulary type. The only reason to use the non-throwing API is if it eliminates a case of "using exceptions for control flow.)
std::error_condition provides only syntactic sugar for "catching" error codes; avoid it like the plague.
A path consists of a root_name, a root_directory, and...