#include <iostream>
#include <string>
class X {};
template<typename T>
inline std::string foo(T && rhs) {
return "bad";
}
inline std::string foo(const X & rhs) {
return "good const &";
}
inline std::string foo(X & rhs) {
return "good &";
}
inline std::string foo(X && rhs) {
return "good &&";
}
int main() {
std::cout << foo(X()) << std::endl;
X x;
std::cout << foo(x) << std::endl;
std::cout << foo(static_cast<X const &>(x)) << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgoKY2xhc3MgWCB7fTsKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CmlubGluZSBzdGQ6OnN0cmluZyBmb28oVCAmJiByaHMpIHsKICAgIHJldHVybiAiYmFkIjsKfQoKaW5saW5lIHN0ZDo6c3RyaW5nIGZvbyhjb25zdCBYICYgcmhzKSB7CiAgICByZXR1cm4gImdvb2QgY29uc3QgJiI7Cn0KCmlubGluZSBzdGQ6OnN0cmluZyBmb28oWCAmIHJocykgewogICAgcmV0dXJuICJnb29kICYiOwp9CgppbmxpbmUgc3RkOjpzdHJpbmcgZm9vKFggJiYgcmhzKSB7CiAgICByZXR1cm4gImdvb2QgJiYiOwp9CgppbnQgbWFpbigpIHsKICAgIHN0ZDo6Y291dCA8PCBmb28oWCgpKSA8PCBzdGQ6OmVuZGw7CiAgICBYIHg7CiAgICBzdGQ6OmNvdXQgPDwgZm9vKHgpIDw8IHN0ZDo6ZW5kbDsKICAgIHN0ZDo6Y291dCA8PCBmb28oc3RhdGljX2Nhc3Q8WCBjb25zdCAmPih4KSkgPDwgc3RkOjplbmRsOwogICAgcmV0dXJuIDA7Cn0=