https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83981
Bug ID: 83981 Summary: vector::resize(size_type) should not require T to be CopyInsertable when std=c++14 Product: gcc Version: 7.2.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: libstdc++ Assignee: unassigned at gcc dot gnu.org Reporter: dtrebbien at gmail dot com Target Milestone: --- In C++14, the requirements of vector::resize(size_type) changed. Whereas C++11 requires T to be CopyInsertable, C++14 only requires T to be MoveInsertable and DefaultInsertable. Prompted by investigating the Stack Overflow question "boost::optional vs std::optional for non copyable objects" (https://stackoverflow.com/q/48340618/196844 ), it appears that there are cases where libstdc++ requires T to be CopyInsertable when std=c++14. Here is a test case: #include <vector> #include <boost/optional.hpp> struct foo { foo() {} foo(foo&&) {} }; int main() { typedef boost::optional<foo> T; typedef std::allocator<T> A; typedef std::vector<T, A> X; A m; T *p = std::allocator_traits<A>::allocate(m, 1), v; // DefaultInsertable std::allocator_traits<A>::construct(m, p), std::allocator_traits<A>::destroy(m, p); // MoveInsertable std::allocator_traits<A>::construct(m, p, std::move(v)), std::allocator_traits<A>::destroy(m, p); // CopyInsertable - not well-formed //std::allocator_traits<A>::construct(m, p, v), std::allocator_traits<A>::destroy(m, p); X a; a.resize(1); return 0; } This does not compile in g++ 7.2.0, which produces the error message: "error: use of deleted function 'constexpr foo::foo(const foo&)'". The full error output mentions that __uninitialized_move_if_noexcept_a() is being instantiated, which instantiates __uninitialized_copy_a(), but __uninitialized_copy_a() does not work because T is not copyable.