https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110945
--- Comment #12 from Jonathan Wakely <redi at gcc dot gnu.org> --- That would also benefit this overload: basic_string& assign(initializer_list<_CharT> __l) { return this->assign(__l.begin(), __l.size()); } That currently goes via replace(begin(), end(), l.begin(), l.end()) but we know that an initializer_list cannot possibly alias the string's contents. But we can do even better and avoid any copy if __l.size() <= capacity(): basic_string& assign(initializer_list<_CharT> __l) { const size_type __n = __l.size(); if (__n > capacity()) *this = basic_string(__l.begin(), __l.end(), get_allocator()); else { if (__n) _S_copy(_M_data(), __l.begin(), __n); _M_set_length(__n); } return *this; }