1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
|
#include <iostream>
using namespace std;
class Demo
{
public:
Demo() = default;
Demo(Demo const &other)
{
cout << "Copy constructor\n";
}
Demo(Demo &&tmp)
{
cout << "Move constructor\n";
}
Demo &operator+=(Demo const &rhs) &&
{
cout << "Move +=\n";
return *this;
}
Demo &operator+=(Demo const &rhs) &
{
cout << "Copy +=\n";
Demo tmp(*this);
std::move(tmp) += rhs;
swap(tmp);
return *this;
}
void swap(Demo &rhs)
{}
};
Demo &&operator+(Demo &&lhs, Demo const &rhs)
{
cout << "move operator+\n";
lhs += rhs;
cout << "move operator+ returns\n";
return move(lhs);
}
Demo &&operator+(Demo const &lhs, Demo const &rhs)
{
cout << "copy operator+\n";
Demo tmp(lhs);
// tmp += rhs;
cout << "copy operator+ returns\n";
return move(tmp += rhs);
return move(tmp);
}
int main()
{
Demo d1;
d1 + d1 + d1;
cout << "========\n";
Demo{} + d1 + d1;
}
|