#include <iostream>
#include <string>
struct S {
std::string name_ = "defaulted";
S() = default;
S(const char* name) : name_(name) {}
S(const S& rhs) = default;
S(S&& rhs) { std::swap(name_, rhs.name_); name_ += " moved"; }
};
void fn(S s)
{
std::cout << "fn(" << s.name_ << ")\n";
}
template<typename T>
void fwd_test(T&& t)
{
fn(t);
fn(std::forward<T>(t));
}
int main() {
fwd_test(S("source"));
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgoKc3RydWN0IFMgewoJc3RkOjpzdHJpbmcgbmFtZV8gPSAiZGVmYXVsdGVkIjsKCVMoKSA9IGRlZmF1bHQ7CglTKGNvbnN0IGNoYXIqIG5hbWUpIDogbmFtZV8obmFtZSkge30KCVMoY29uc3QgUyYgcmhzKSA9IGRlZmF1bHQ7CglTKFMmJiByaHMpIHsgc3RkOjpzd2FwKG5hbWVfLCByaHMubmFtZV8pOyBuYW1lXyArPSAiIG1vdmVkIjsgfQp9OwoKdm9pZCBmbihTIHMpCnsKCXN0ZDo6Y291dCA8PCAiZm4oIiA8PCBzLm5hbWVfIDw8ICIpXG4iOwp9Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgp2b2lkIGZ3ZF90ZXN0KFQmJiB0KQp7Cglmbih0KTsKCWZuKHN0ZDo6Zm9yd2FyZDxUPih0KSk7Cn0KCmludCBtYWluKCkgewoJZndkX3Rlc3QoUygic291cmNlIikpOwp9