#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
	}
}