#include <iostream>
#include <string>
class T
{
public:
T(const std::string& name): name_(name), copy_(0){}
T(const T& rhs)
: name_(rhs.name_), copy_(rhs.copy_)
{
copy_++;
}
void op(){ std::cout << name_ << "-copy: " << copy_ << std::endl; }
private:
int copy_;
std::string name_;
};
T op1(const T& val) // pass by const reference
{
std::cout << "op1" << std::endl;
T tmp(val); //copy ctor
tmp.op();
return tmp;
}
T op2(T val) // pass by value
{
std::cout << "op2" << std::endl;
val.op();
return val;
}
int main( int argc, char* argv[] )
{
T t("lvalue");
op1(t).op();
op1(T("rvalue")).op();
op2(t).op();
op2(T("rvalue")).op();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgoKY2xhc3MgVAp7CnB1YmxpYzoKCVQoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpOiBuYW1lXyhuYW1lKSwgY29weV8oMCl7fQoJVChjb25zdCBUJiByaHMpCgkJOiBuYW1lXyhyaHMubmFtZV8pLCBjb3B5XyhyaHMuY29weV8pCgl7CgkJY29weV8rKzsKCX0KCQoJdm9pZCBvcCgpeyBzdGQ6OmNvdXQgPDwgbmFtZV8gPDwgIi1jb3B5OiAiIDw8IGNvcHlfIDw8IHN0ZDo6ZW5kbDsgfQpwcml2YXRlOgoJaW50IGNvcHlfOwoJc3RkOjpzdHJpbmcgbmFtZV87Cn07CgpUIG9wMShjb25zdCBUJiB2YWwpIC8vIHBhc3MgYnkgY29uc3QgcmVmZXJlbmNlCnsKCXN0ZDo6Y291dCA8PCAib3AxIiA8PCBzdGQ6OmVuZGw7CglUIHRtcCh2YWwpOwkvL2NvcHkgY3RvcgoJdG1wLm9wKCk7CglyZXR1cm4gdG1wOwp9CgpUIG9wMihUIHZhbCkgLy8gcGFzcyBieSB2YWx1ZQp7CglzdGQ6OmNvdXQgPDwgIm9wMiIgPDwgc3RkOjplbmRsOwoJdmFsLm9wKCk7CglyZXR1cm4gdmFsOwp9CgppbnQgbWFpbiggaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSApCnsKCVQgdCgibHZhbHVlIik7CgkKCW9wMSh0KS5vcCgpOwoJb3AxKFQoInJ2YWx1ZSIpKS5vcCgpOwoJCglvcDIodCkub3AoKTsKCW9wMihUKCJydmFsdWUiKSkub3AoKTsKCQoJcmV0dXJuIDA7Cn0=