https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97814
--- Comment #2 from Jonathan Wakely <redi at gcc dot gnu.org> --- There is no copy in C++17, it is elided, so lock(S(1)) is equivalent to lock(1) in C++17, and that constructor exists. GCC is correct.