#include <iostream>
#include <iostream>
template<class... T>
struct non_copyable_type {
non_copyable_type() = delete;
non_copyable_type(const non_copyable_type&) = delete;
non_copyable_type(const T&...) {};
};
using T1 = non_copyable_type<int>;
using T2 = T1;
using TL1 = non_copyable_type<T1, T2>;
using foo_t = non_copyable_type<T1, T2, TL1>;
template<class... Args>
void side_effects(Args&&... args) {
std::cout << "side effects" << std::endl;
}
template<class... Args>
void second_side_effects(Args&&... args) {
std::cout << "second side effects" << std::endl;
}
template<class... Args>
void final_side_effects(Args&&... args) {
std::cout << "final side effects" << std::endl;
}
struct C {
C(const T1& arg_1, const T2& arg_2) {
side_effects(arg_1, arg_2);
TL1 local_1(arg_1, arg_2);
second_side_effects(arg_1, arg_2, local_1);
foo_t f(arg_1, arg_2, local_1); // the actual construction
final_side_effects(arg_1, arg_2, local_1, f);
}
};
struct C2 {
C2(const T1& arg_1, const T2& arg_2)
: C2(arg_1, arg_2
,([](const T1& a, const T2& b){
side_effects(a, b);
}(arg_1, arg_2), TL1(arg_1, arg_2))) {}
C2(const T1& arg_1, const T2& arg_2, TL1&& local_1)
: C2(arg_1, arg_2
,[](const T1& a, const T2& b, TL1& c) -> TL1& {
second_side_effects(a, b, c);
return c;
}(arg_1, arg_2, local_1)) {}
C2(const T1& arg_1, const T2& arg_2, TL1& local_1)
: f(arg_1, arg_2, local_1) {
final_side_effects(arg_1, arg_2, local_1, f);
}
private:
foo_t f;
};
int main() {
T1 a(0);
T2 b(0);
C c1(a, b);
C2 c2(a, b);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aW9zdHJlYW0+Cgp0ZW1wbGF0ZTxjbGFzcy4uLiBUPgpzdHJ1Y3Qgbm9uX2NvcHlhYmxlX3R5cGUgewoJbm9uX2NvcHlhYmxlX3R5cGUoKSA9IGRlbGV0ZTsKCW5vbl9jb3B5YWJsZV90eXBlKGNvbnN0IG5vbl9jb3B5YWJsZV90eXBlJikgPSBkZWxldGU7Cglub25fY29weWFibGVfdHlwZShjb25zdCBUJi4uLikge307Cn07Cgp1c2luZyBUMSAgPSBub25fY29weWFibGVfdHlwZTxpbnQ+Owp1c2luZyBUMiAgPSBUMTsKdXNpbmcgVEwxID0gbm9uX2NvcHlhYmxlX3R5cGU8VDEsIFQyPjsKCnVzaW5nIGZvb190ID0gbm9uX2NvcHlhYmxlX3R5cGU8VDEsIFQyLCBUTDE+OwoKdGVtcGxhdGU8Y2xhc3MuLi4gQXJncz4Kdm9pZCBzaWRlX2VmZmVjdHMoQXJncyYmLi4uIGFyZ3MpIHsKCXN0ZDo6Y291dCA8PCAic2lkZSBlZmZlY3RzIiA8PCBzdGQ6OmVuZGw7Cn0KdGVtcGxhdGU8Y2xhc3MuLi4gQXJncz4Kdm9pZCBzZWNvbmRfc2lkZV9lZmZlY3RzKEFyZ3MmJi4uLiBhcmdzKSB7CglzdGQ6OmNvdXQgPDwgInNlY29uZCBzaWRlIGVmZmVjdHMiIDw8IHN0ZDo6ZW5kbDsKfQp0ZW1wbGF0ZTxjbGFzcy4uLiBBcmdzPgp2b2lkIGZpbmFsX3NpZGVfZWZmZWN0cyhBcmdzJiYuLi4gYXJncykgewoJc3RkOjpjb3V0IDw8ICJmaW5hbCBzaWRlIGVmZmVjdHMiIDw8IHN0ZDo6ZW5kbDsKfQoKc3RydWN0IEMgewoJQyhjb25zdCBUMSYgYXJnXzEsIGNvbnN0IFQyJiBhcmdfMikgewogICAgCQlzaWRlX2VmZmVjdHMoYXJnXzEsIGFyZ18yKTsKICAgIAkJVEwxIGxvY2FsXzEoYXJnXzEsIGFyZ18yKTsKICAgIAkJc2Vjb25kX3NpZGVfZWZmZWN0cyhhcmdfMSwgYXJnXzIsIGxvY2FsXzEpOwogICAgCQlmb29fdCBmKGFyZ18xLCBhcmdfMiwgbG9jYWxfMSk7IC8vIHRoZSBhY3R1YWwgY29uc3RydWN0aW9uCiAgICAJCWZpbmFsX3NpZGVfZWZmZWN0cyhhcmdfMSwgYXJnXzIsIGxvY2FsXzEsIGYpOwoJfQp9OwoKc3RydWN0IEMyIHsKCUMyKGNvbnN0IFQxJiBhcmdfMSwgY29uc3QgVDImIGFyZ18yKQoJOiBDMihhcmdfMSwgYXJnXzIKICAgICAgICAgICAgICAgICwoW10oY29uc3QgVDEmIGEsIGNvbnN0IFQyJiBiKXsKCSAgICAgICAgICAgICBzaWRlX2VmZmVjdHMoYSwgYik7CiAgICAgICAgICAgICAgICB9KGFyZ18xLCBhcmdfMiksIFRMMShhcmdfMSwgYXJnXzIpKSkge30KCglDMihjb25zdCBUMSYgYXJnXzEsIGNvbnN0IFQyJiBhcmdfMiwgVEwxJiYgbG9jYWxfMSkKCTogQzIoYXJnXzEsIGFyZ18yCgkgICAgLFtdKGNvbnN0IFQxJiBhLCBjb25zdCBUMiYgYiwgVEwxJiBjKSAtPiBUTDEmIHsKCSAgICAgICAgICAgIHNlY29uZF9zaWRlX2VmZmVjdHMoYSwgYiwgYyk7CgkgICAgICAgICAgICByZXR1cm4gYzsKCSAgICB9KGFyZ18xLCBhcmdfMiwgbG9jYWxfMSkpIHt9CgoJQzIoY29uc3QgVDEmIGFyZ18xLCBjb25zdCBUMiYgYXJnXzIsIFRMMSYgbG9jYWxfMSkKCTogZihhcmdfMSwgYXJnXzIsIGxvY2FsXzEpIHsKCSAgICBmaW5hbF9zaWRlX2VmZmVjdHMoYXJnXzEsIGFyZ18yLCBsb2NhbF8xLCBmKTsKCX0KcHJpdmF0ZToKCWZvb190IGY7Cn07CgppbnQgbWFpbigpIHsKCVQxIGEoMCk7CglUMiBiKDApOwoJQyBjMShhLCBiKTsKCUMyIGMyKGEsIGIpOwp9