https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102064
--- Comment #1 from Jonathan Wakely <redi at gcc dot gnu.org> --- The assignable checks are also missing for C++98, but there are types which can be constructed via std::uninitialized_foo that cannot be assigned to by std::foo #include <memory> #include <algorithm> struct X; struct Y { operator X() const; }; struct X { private: void operator=(const Y&); }; Y::operator X() const { return X(); } int main() { unsigned char buf[sizeof(X)]; Y y; std::uninitialized_fill_n((X*)buf, 1, y); } This should copy-construct an X from the result of the conversion operator. But we optimize it to std::fill_n which tries to use the inaccessible assignment. /usr/include/c++/11/bits/stl_algobase.h:912:18: error: ‘void X::operator=(const Y&)’ is private within this context 912 | *__first = __value; | ~~~~~~~~~^~~~~~~~~