Hi I created a class Foo with a noexcept move constructor using gcc 4.7 and set the vector reserve size to 2 so that it would have to reallocate the size when adding the 3rd item. It seems it is calling the copy constructor instead of the move constructor when doing this. Am I missing something here?
#include <vector> #include <iostream> class Foo { public: Foo(int x) : data_(x) { std::cout << " constructing " << std::endl; } ~Foo() { std::cout << " destructing " << std::endl; } Foo& operator=(const Foo&) = default; Foo& operator=(Foo&&) = default; Foo(Foo&& other) noexcept : data_(std::move(other.data_)) { std::cout << " Move constructing " << std::endl; } Foo(const Foo& other) noexcept : data_(other.data_) { std::cout << " Copy constructing " << std::endl; } private: int data_; }; int main ( int argc, char *argv[]) { std::vector<Foo> v; v.reserve(2); v.emplace_back(1); std::cout << "Added 1" << std::endl; v.emplace_back(2); std::cout << "Added 2" << std::endl; v.emplace_back(3); std::cout << "Added 3" << std::endl; std::cout << "v size: " << v.size() << std::endl; } output:
constructing Added 1 constructing Added 2 constructing Copy constructing Copy constructing destructing destructing Added 3 v size: 3 destructing destructing destructing
vectorcalls the move constructor) with GCC 4.8.1.