#include <algorithm>
#include <iostream>
#include <iomanip>
using namespace std;
struct MinimalObj {
int id; // NOLINT(misc-non-private-member-variables-in-classes)
// Draft check for leaks, double-frees and non-inits.
// NOLINTNEXTLINE(misc-non-private-member-variables-in-classes)
std::string data = std::string(500U, 'x');
explicit MinimalObj(int id_) : id(id_) {}
MinimalObj(MinimalObj &&) = default;
MinimalObj &operator=(MinimalObj &&) = default;
MinimalObj(const MinimalObj &) = delete;
MinimalObj &operator=(const MinimalObj &) = delete;
~MinimalObj() = default;
};
template<class T>
void func(T&a, T&b)
{
if constexpr(is_move_assignable<T>::value)
{
a = std::move(b);
}
else
{
a = b;
}
}
int main(int argc, char * argv[])
{
MinimalObj d(1), q(2);
func(d,q);
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aW9tYW5pcD4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpzdHJ1Y3QgTWluaW1hbE9iaiB7CiAgICBpbnQgaWQ7ICAvLyBOT0xJTlQobWlzYy1ub24tcHJpdmF0ZS1tZW1iZXItdmFyaWFibGVzLWluLWNsYXNzZXMpCgogICAgLy8gRHJhZnQgY2hlY2sgZm9yIGxlYWtzLCBkb3VibGUtZnJlZXMgYW5kIG5vbi1pbml0cy4KICAgIC8vIE5PTElOVE5FWFRMSU5FKG1pc2Mtbm9uLXByaXZhdGUtbWVtYmVyLXZhcmlhYmxlcy1pbi1jbGFzc2VzKQogICAgc3RkOjpzdHJpbmcgZGF0YSA9IHN0ZDo6c3RyaW5nKDUwMFUsICd4Jyk7CgogICAgZXhwbGljaXQgTWluaW1hbE9iaihpbnQgaWRfKSA6IGlkKGlkXykge30KICAgIE1pbmltYWxPYmooTWluaW1hbE9iaiAmJikgPSBkZWZhdWx0OwogICAgTWluaW1hbE9iaiAmb3BlcmF0b3I9KE1pbmltYWxPYmogJiYpID0gZGVmYXVsdDsKCiAgICBNaW5pbWFsT2JqKGNvbnN0IE1pbmltYWxPYmogJikgPSBkZWxldGU7CiAgICBNaW5pbWFsT2JqICZvcGVyYXRvcj0oY29uc3QgTWluaW1hbE9iaiAmKSA9IGRlbGV0ZTsKCiAgICB+TWluaW1hbE9iaigpID0gZGVmYXVsdDsKfTsKCnRlbXBsYXRlPGNsYXNzIFQ+CnZvaWQgZnVuYyhUJmEsIFQmYikKewogICAgaWYgY29uc3RleHByKGlzX21vdmVfYXNzaWduYWJsZTxUPjo6dmFsdWUpCiAgICB7CiAgICAgICAgYSA9IHN0ZDo6bW92ZShiKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBhID0gYjsKICAgIH0KfQoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiBhcmd2W10pCnsKICAgIE1pbmltYWxPYmogZCgxKSwgcSgyKTsKICAgIGZ1bmMoZCxxKTsKfQoK