#include <iostream>
#include <algorithm>
class Matrix4 {
float* m;
public:
Matrix4() : m(new float[16]) {}
Matrix4(const Matrix4& other) : m(new float[16])
{ std::copy(other.m, other.m+16, m); std::cout << "\ncopy"; }
Matrix4(Matrix4&& other) : m(other.m) { other.m = 0; std::cout << "\nmove"; }
~Matrix4() { delete[] m; }
Matrix4& operator+= (const Matrix4& other)
{
for(auto i = 0; i < 16; ++i) { m[i] += other.m[i]; }
return *this;
}
};
Matrix4 operator+ (Matrix4 l /* move from temporary*/, const Matrix4& r)
{
std::cout << "\noperator+(Matrix4, const Matrix4&)";
return std::move(l += r); // move explicitly, because += returns lvalue reference
}
Matrix4 operator+ (const Matrix4& l, Matrix4&& r)
{
std::cout << "\nnoperator+(const Matrix4&, Matrix4&&)";
return std::move(r += l); // move explicitly
}
int main()
{
Matrix4 a;
std::cout << "\nMatrix4 b(a+a)";
Matrix4 b(a+a);
std::cout << "\nMatrix4 c(a + a + a)";
Matrix4 c(a + a + a);
std::cout << "\nMatrix4 d(a + (a + a))";
Matrix4 d(a + (a + a));
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8YWxnb3JpdGhtPgoKY2xhc3MgTWF0cml4NCB7CiAgIGZsb2F0KiBtOwpwdWJsaWM6CiAgIE1hdHJpeDQoKSA6IG0obmV3IGZsb2F0WzE2XSkge30KICAgTWF0cml4NChjb25zdCBNYXRyaXg0JiBvdGhlcikgIDogbShuZXcgZmxvYXRbMTZdKSAKICAgeyBzdGQ6OmNvcHkob3RoZXIubSwgb3RoZXIubSsxNiwgbSk7IHN0ZDo6Y291dCA8PCAiXG5jb3B5IjsgfQogICBNYXRyaXg0KE1hdHJpeDQmJiBvdGhlcikgOiBtKG90aGVyLm0pIHsgb3RoZXIubSA9IDA7IHN0ZDo6Y291dCA8PCAiXG5tb3ZlIjsgfQogICB+TWF0cml4NCgpIHsgZGVsZXRlW10gbTsgfQogICBNYXRyaXg0JiBvcGVyYXRvcis9IChjb25zdCBNYXRyaXg0JiBvdGhlcikgCiAgIHsgCiAgICAgIGZvcihhdXRvIGkgPSAwOyBpIDwgMTY7ICsraSkgeyBtW2ldICs9IG90aGVyLm1baV07IH0KICAgICAgcmV0dXJuICp0aGlzOwogICB9Cn07CgpNYXRyaXg0IG9wZXJhdG9yKyAoTWF0cml4NCBsIC8qIG1vdmUgZnJvbSB0ZW1wb3JhcnkqLywgY29uc3QgTWF0cml4NCYgcikgCnsgCiAgIHN0ZDo6Y291dCA8PCAiXG5vcGVyYXRvcisoTWF0cml4NCwgY29uc3QgTWF0cml4NCYpIjsKICAgcmV0dXJuIHN0ZDo6bW92ZShsICs9IHIpOyAvLyBtb3ZlIGV4cGxpY2l0bHksIGJlY2F1c2UgKz0gcmV0dXJucyBsdmFsdWUgcmVmZXJlbmNlCn0KCk1hdHJpeDQgb3BlcmF0b3IrIChjb25zdCBNYXRyaXg0JiBsLCBNYXRyaXg0JiYgcikgCnsgCiAgIHN0ZDo6Y291dCA8PCAiXG5ub3BlcmF0b3IrKGNvbnN0IE1hdHJpeDQmLCBNYXRyaXg0JiYpIjsKICAgcmV0dXJuIHN0ZDo6bW92ZShyICs9IGwpOyAvLyBtb3ZlIGV4cGxpY2l0bHkKfQoKaW50IG1haW4oKQp7CiAgIE1hdHJpeDQgYTsKICAgc3RkOjpjb3V0IDw8ICJcbk1hdHJpeDQgYihhK2EpIjsKICAgTWF0cml4NCBiKGErYSk7CiAgIHN0ZDo6Y291dCA8PCAiXG5NYXRyaXg0IGMoYSArIGEgKyBhKSI7CiAgIE1hdHJpeDQgYyhhICsgYSArIGEpOwogICBzdGQ6OmNvdXQgPDwgIlxuTWF0cml4NCBkKGEgKyAoYSArIGEpKSI7CiAgIE1hdHJpeDQgZChhICsgKGEgKyBhKSk7Cn0=