#include <utility>
#include <tuple>
#include <iostream>
struct A{
A() {std::cout << "def-ctor\n";}
A(const A&) {std::cout << "copy-ctor\n";}
A(A&&) {std::cout << "move-ctor\n";}
A&operator=(const A&) {std::cout << "copy-asgn\n"; return *this;}
A&operator=(A&&) {std::cout << "move-asgn\n"; return *this;}
~A() {std::cout << "dtor\n";}
};
std::tuple<A, A> func() {
std::cout << "starting func\n";
std::tuple<A, A> ret;
std::cout << "returning from func\n";
return ret;
}
int main() {
A one, two;
std::cout << "entering func\n";
std::tie(one, two) = func();
std::cout << "test complete\n";
}
I2luY2x1ZGUgPHV0aWxpdHk+CiNpbmNsdWRlIDx0dXBsZT4KI2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RydWN0IEF7CiAgICBBKCkge3N0ZDo6Y291dCA8PCAiZGVmLWN0b3JcbiI7fQogICAgQShjb25zdCBBJikge3N0ZDo6Y291dCA8PCAiY29weS1jdG9yXG4iO30KICAgIEEoQSYmKSB7c3RkOjpjb3V0IDw8ICJtb3ZlLWN0b3JcbiI7fQogICAgQSZvcGVyYXRvcj0oY29uc3QgQSYpIHtzdGQ6OmNvdXQgPDwgImNvcHktYXNnblxuIjsgcmV0dXJuICp0aGlzO30KICAgIEEmb3BlcmF0b3I9KEEmJikge3N0ZDo6Y291dCA8PCAibW92ZS1hc2duXG4iOyByZXR1cm4gKnRoaXM7fQogICAgfkEoKSB7c3RkOjpjb3V0IDw8ICJkdG9yXG4iO30KfTsKCnN0ZDo6dHVwbGU8QSwgQT4gZnVuYygpIHsKICAgIHN0ZDo6Y291dCA8PCAic3RhcnRpbmcgZnVuY1xuIjsKICAgIHN0ZDo6dHVwbGU8QSwgQT4gcmV0OwogICAgc3RkOjpjb3V0IDw8ICJyZXR1cm5pbmcgZnJvbSBmdW5jXG4iOwogICAgcmV0dXJuIHJldDsKfQoKaW50IG1haW4oKSB7CiAgICBBIG9uZSwgdHdvOwogICAgc3RkOjpjb3V0IDw8ICJlbnRlcmluZyBmdW5jXG4iOwogICAgc3RkOjp0aWUob25lLCB0d28pID0gZnVuYygpOwogICAgc3RkOjpjb3V0IDw8ICJ0ZXN0IGNvbXBsZXRlXG4iOwp9