In my mind these are the things that should be happening to this program
1. Int i(i) -> Create a new Int object, call the copy ctor.
2. print(std::move(i)) -> Create an Rvalue reference out of i and then assign it to a, and in doing so call the move ctor.
3. cout "print 1".
4. cout "main func -1", because the move ctor pillaged its resource.
So my expectation of the output is:
ctor
move ctor
print 1
main func -1
But, the move ctor is never called. And this is the output that is actually seen:
ctor
print 2
main func 2
class Int {
public:
Int(int i) : i_(i) { std::cout << "ctor" << std::endl; }
Int(const Int& other) {
std::cout << "copy ctor " << std::endl;
i_ = other.i_;
}
Int(Int&& other) {
std::cout << "move ctor " << std::endl;
i_ = other.i_;
// Pillage the other's resource by setting its value to -1.
other.i_ = -1;
}
int i_;
};
void print(Int&& a) { std::cout << "print " << a.i_ << std::endl; }
int main() {
Int i(1);
print(std::move(i));
std::cout << "main func " << i.i_ << std::endl;
}
Why is that ?