#include <iostream>
using namespace std;
class foo {
int data;
public:
template <typename T, typename = enable_if_t<is_constructible<T, int>::value>>
foo(const T& i) : data{ i } { cout << "Value copy ctor" << endl; }
template <typename T, typename = enable_if_t<is_constructible<T, int>::value>>
foo(T&& i) : data{ i } { cout << "Value move ctor" << endl; }
foo(const foo& other) : data{ other.data } { cout << "Copy ctor" << endl; }
foo(foo&& other) : data{ other.data } { cout << "Move ctor" << endl; }
operator int() { cout << "Operator int()" << endl; return data; }
};
int main() {
foo obj1(42);
foo obj2(obj1);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgZm9vIHsKICAgIGludCBkYXRhOwpwdWJsaWM6CiAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgPSBlbmFibGVfaWZfdDxpc19jb25zdHJ1Y3RpYmxlPFQsIGludD46OnZhbHVlPj4KICAgIGZvbyhjb25zdCBUJiBpKSA6IGRhdGF7IGkgfSB7IGNvdXQgPDwgIlZhbHVlIGNvcHkgY3RvciIgPDwgZW5kbDsgfQoKICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSA9IGVuYWJsZV9pZl90PGlzX2NvbnN0cnVjdGlibGU8VCwgaW50Pjo6dmFsdWU+PgogICAgZm9vKFQmJiBpKSA6IGRhdGF7IGkgfSB7IGNvdXQgPDwgIlZhbHVlIG1vdmUgY3RvciIgPDwgZW5kbDsgfQoKICAgIGZvbyhjb25zdCBmb28mIG90aGVyKSA6IGRhdGF7IG90aGVyLmRhdGEgfSB7IGNvdXQgPDwgIkNvcHkgY3RvciIgPDwgZW5kbDsgfQoKICAgIGZvbyhmb28mJiBvdGhlcikgOiBkYXRheyBvdGhlci5kYXRhIH0geyBjb3V0IDw8ICJNb3ZlIGN0b3IiIDw8IGVuZGw7IH0KCiAgICBvcGVyYXRvciBpbnQoKSB7IGNvdXQgPDwgIk9wZXJhdG9yIGludCgpIiA8PCBlbmRsOyByZXR1cm4gZGF0YTsgfQp9OwoKaW50IG1haW4oKSB7CiAgICBmb28gb2JqMSg0Mik7CiAgICBmb28gb2JqMihvYmoxKTsKfQ==