#include<iostream>
#include<sstream>
struct A{
int impl_;
};
std::ostringstream& operator<<(std::ostringstream& oss, A const& a){
oss << "A(" << a.impl_ << ")";
return oss;
}
std::ostringstream& operator<<(std::ostringstream&& oss, A const& a){
return operator<<(std::move(oss), a);
// oss << "A(" << a.impl_ << ")";
// return oss;
}
int main() {
A a{2};
{// C++98 way
std::ostringstream oss;
oss << a;
std::cout << oss.str() << std::endl; // prints "A(2)", ok"
}
{// possible with C++11, because of the rvalue overload
std::cout << (std::ostringstream() << a).str() << std::endl; //prints "A(2)", ok
}
}
I2luY2x1ZGU8aW9zdHJlYW0+CiNpbmNsdWRlPHNzdHJlYW0+CnN0cnVjdCBBewoJaW50IGltcGxfOwp9OwoKc3RkOjpvc3RyaW5nc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmluZ3N0cmVhbSYgb3NzLCBBIGNvbnN0JiBhKXsKCW9zcyA8PCAiQSgiIDw8IGEuaW1wbF8gPDwgIikiOwoJcmV0dXJuIG9zczsKfQoKc3RkOjpvc3RyaW5nc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmluZ3N0cmVhbSYmIG9zcywgQSBjb25zdCYgYSl7CglyZXR1cm4gb3BlcmF0b3I8PChzdGQ6Om1vdmUob3NzKSwgYSk7Ci8vCW9zcyA8PCAiQSgiIDw8IGEuaW1wbF8gPDwgIikiOwovLwlyZXR1cm4gb3NzOwp9CgoKaW50IG1haW4oKSB7CgkKCUEgYXsyfTsKCXsvLyBDKys5OCB3YXkKCQlzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOwoJCW9zcyA8PCBhOwoJCXN0ZDo6Y291dCA8PCBvc3Muc3RyKCkgPDwgc3RkOjplbmRsOyAvLyBwcmludHMgIkEoMikiLCBvayIKCX0KCXsvLyBwb3NzaWJsZSB3aXRoIEMrKzExLCBiZWNhdXNlIG9mIHRoZSBydmFsdWUgb3ZlcmxvYWQKCQlzdGQ6OmNvdXQgPDwgKHN0ZDo6b3N0cmluZ3N0cmVhbSgpIDw8IGEpLnN0cigpIDw8IHN0ZDo6ZW5kbDsgLy9wcmludHMgIkEoMikiLCBvawoJfQp9