mercredi 25 novembre 2015

"Defaulted" move constructor and assignment - weird behaviour

So I have a simple example of a class which has two member variables. And I've declared a copy and a move constructor which are = default, which would force the compiler to generate them for me. Now my question is this. When the move constructor (or assignment) is used, why does the object from which I've moved stay intact?

For example if I have:

myclass obj(4, 5);
myclass obj2 = std::move(4, 5);

As I understand it, after the second line obj will contain "nothing", as it will have been moved into obj2 which will have the values (4, 5). I know I'm not using to correct terms here....

Full code:

#include <iostream>
#include <utility>

template<class T1, class T2>
class Pair
{
public:
    T1 first;
    T2 second;

public:
    //CONSTRUCTORS
    constexpr Pair() = default;

    constexpr Pair(const T1& _first, const T2& _second)
        : first(_first), second(_second)
    {}

    constexpr Pair(T1&& _first, T2&& _second)
        : first(std::forward<T1>(_first)), second(std::forward<T2>(_second))
    {}

    constexpr Pair(const Pair&) = default;
    constexpr Pair(Pair&&)      = default;

    //ASSIGNMENT
    Pair &operator=(const Pair&) = default;
    Pair &operator=(Pair&&)      = default;
};

int main()
{
    Pair<int, int> p(1, 2);

    Pair<int, int> p2 = p; //all good, p = {1, 2} and p2 = {1, 2}

    Pair<int, int> p3 = std::move(p); //p = {1, 2} and p3 = {1, 2}
                                    //why isn't p "moved" into p3??
                                    //p should be empty??

    //same thing occurs with the move assignment. why?

    std::cout << p.first << " " << p.second << "\n";
    std::cout << p2.first << " " << p2.second << "\n";
    std::cout << p3.first << " " << p3.second << "\n";
}

Live example: http://ift.tt/1XfpAkA

Aucun commentaire:

Enregistrer un commentaire