https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106932
--- Comment #2 from Jonathan Wakely <redi at gcc dot gnu.org> --- I think this is the correct behaviour according to the standard. Where f is status("source") and t is status("dest"). Effects are then as follows: - If f.type() or t.type() is an implementation-defined file type ... [they're not] - Otherwise, an error is reported as specified in 31.12.5 if: [list of conditions that are not true] - Otherwise, if is_symlink(f), then: [it's not] - Otherwise, if is_regular_file(f), then: [it's not] - Otherwise, if is_directory(f) && (options & copy_options::create_symlinks) != copy_options::none [create_symlinks is not set in the options] - Otherwise, if is_directory(f) && ((options & copy_options::recursive) != copy_options::none || options == copy_options::none) [this is the case we want to hit, but the condition is false because recursive is not set and options != none] - Otherwise, for the signature with argument ec, ec.clear(). [You didn't pass an erroc_code] - Otherwise, no effects. [Bingo] So you need to use copy_options::recursive to get the effects you want.