#include <iostream>
struct A {
public:
int id;
bool copy;
explicit A() : id(42) {
std::cout << "CTor: " << id << std::endl;
copy = false;
}
A(int val) : id(val) {
std::cout << "CTor: " << id << std::endl;
copy = false;
}
A(const A& a) {
std::cout << "Copy CTor" << std::endl;
copy = true;
id = a.id * 2;
}
A(const A&& a) {
std::cout << "Move" << std::endl;
id = a.id;
copy = false;
}
~A() {
if (copy)
std::cout << "Copy ";
std::cout << "DTor: " << id << std::endl;
}
};
void foo(A a) {
std::cout << "foo says " << a.id << std::endl;
}
int main() {
A a;
foo(a);
std::cout << "====" << std::endl;
foo(A(23));
std::cout << "end of main" << std::endl;
}