#include <iostream>
#include <utility>
struct A {
int x;
explicit A(int val) : x(val) {}
};
void add(A&& a, A&& b, A&& c) {
std::cout << "&&:" << (a.x + b.x + c.x) << std::endl;
}
void add(const A& a, const A& b, const A& c) {
std::cout << "const&:" << (a.x + b.x + c.x) << std::endl;
}
template <typename ...Args>
void call(Args&& ...args) {
add(std::forward<Args>(args)...);
}
int main() {
A a(4);
A b(5);
A c(6);
add(A(1), A(3), A(2));
add(a, b, c);
add(A(1), b, A(2));
add(a, A(2), A(2));
std::cout << "-----\n";
call(A(1), A(3), A(2));
call(a, b, c);
call(A(1), b, A(2));
call(a, A(2), A(2));
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dXRpbGl0eT4KCnN0cnVjdCBBIHsKCWludCB4OwoJZXhwbGljaXQgQShpbnQgdmFsKSA6IHgodmFsKSB7fQp9OwoKdm9pZCBhZGQoQSYmIGEsIEEmJiBiLCBBJiYgYykgewoJc3RkOjpjb3V0IDw8ICImJjoiIDw8IChhLnggKyBiLnggKyBjLngpIDw8IHN0ZDo6ZW5kbDsKfQoKdm9pZCBhZGQoY29uc3QgQSYgYSwgY29uc3QgQSYgYiwgY29uc3QgQSYgYykgewoJc3RkOjpjb3V0IDw8ICJjb25zdCY6IiA8PCAoYS54ICsgYi54ICsgYy54KSA8PCBzdGQ6OmVuZGw7Cn0KCnRlbXBsYXRlIDx0eXBlbmFtZSAuLi5BcmdzPgp2b2lkIGNhbGwoQXJncyYmIC4uLmFyZ3MpIHsKCWFkZChzdGQ6OmZvcndhcmQ8QXJncz4oYXJncykuLi4pOwp9CgppbnQgbWFpbigpIHsKCUEgYSg0KTsKCUEgYig1KTsKCUEgYyg2KTsKCWFkZChBKDEpLCBBKDMpLCBBKDIpKTsKCWFkZChhLCBiLCBjKTsKCWFkZChBKDEpLCBiLCBBKDIpKTsKCWFkZChhLCBBKDIpLCBBKDIpKTsKCXN0ZDo6Y291dCA8PCAiLS0tLS1cbiI7CgljYWxsKEEoMSksIEEoMyksIEEoMikpOwoJY2FsbChhLCBiLCBjKTsKCWNhbGwoQSgxKSwgYiwgQSgyKSk7CgljYWxsKGEsIEEoMiksIEEoMikpOwp9