#include<iostream>
class MyClass
{
public:
MyClass() {std::cout << "Default Constructor\n";}
MyClass(const MyClass &input) {std::cout << "Copy Constructor\n";}
MyClass(MyClass &&input) {std::cout << "Move Constructor\n";}
MyClass & operator=(const MyClass &input) {std::cout << "Assignment\n"; return *this;}
friend MyClass operator+(const MyClass &lhs,const MyClass &rhs) {return lhs;}
template<typename T>
friend MyClass operator-(T &&lhs,T &&rhs) {return std::forward<T>(lhs);}
};
MyClass something() {return MyClass();} // Dummy function to illustrate when RVO occurs
int main()
{
{
std::cout << "Test 1+" << std::endl;
MyClass a,b,c;
c=a+b;
}
{
std::cout << "Test 1-" << std::endl;
MyClass a,b,c;
c=a-b;
}
{
std::cout << "Test 2+" << std::endl;
MyClass a,b;
MyClass c=a+b;
}
{
std::cout << "Test 2-" << std::endl;
MyClass a,b;
MyClass c=a-b;
}
{
std::cout << "Test 3+" << std::endl;
MyClass a=something(),b=something();
MyClass c=a+b;
}
{
std::cout << "Test 3-" << std::endl;
MyClass a=something(),b=something();
MyClass c=a-b;
}
{
std::cout << "Test 4+" << std::endl;
MyClass c=something()+something();
}
{
std::cout << "Test 4-" << std::endl;
MyClass c=something()-something();
}
return 0;
}
I2luY2x1ZGU8aW9zdHJlYW0+CgpjbGFzcyBNeUNsYXNzCnsKcHVibGljOgogICAgTXlDbGFzcygpIHtzdGQ6OmNvdXQgPDwgIkRlZmF1bHQgQ29uc3RydWN0b3JcbiI7fQogICAgTXlDbGFzcyhjb25zdCBNeUNsYXNzICZpbnB1dCkge3N0ZDo6Y291dCA8PCAiQ29weSBDb25zdHJ1Y3RvclxuIjt9CiAgICBNeUNsYXNzKE15Q2xhc3MgJiZpbnB1dCkge3N0ZDo6Y291dCA8PCAiTW92ZSBDb25zdHJ1Y3RvclxuIjt9CiAgICBNeUNsYXNzICYgb3BlcmF0b3I9KGNvbnN0IE15Q2xhc3MgJmlucHV0KSB7c3RkOjpjb3V0IDw8ICJBc3NpZ25tZW50XG4iOyByZXR1cm4gKnRoaXM7fQogICAgZnJpZW5kIE15Q2xhc3Mgb3BlcmF0b3IrKGNvbnN0IE15Q2xhc3MgJmxocyxjb25zdCBNeUNsYXNzICZyaHMpIHtyZXR1cm4gbGhzO30KICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CiAgICBmcmllbmQgTXlDbGFzcyBvcGVyYXRvci0oVCAmJmxocyxUICYmcmhzKSB7cmV0dXJuIHN0ZDo6Zm9yd2FyZDxUPihsaHMpO30KfTsKCk15Q2xhc3Mgc29tZXRoaW5nKCkge3JldHVybiBNeUNsYXNzKCk7fSAvLyBEdW1teSBmdW5jdGlvbiB0byBpbGx1c3RyYXRlIHdoZW4gUlZPIG9jY3VycwoKaW50IG1haW4oKQp7CiAgICB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJUZXN0IDErIiA8PCBzdGQ6OmVuZGw7CiAgICAgICAgTXlDbGFzcyBhLGIsYzsKICAgICAgICBjPWErYjsKICAgIH0KICAgIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgIlRlc3QgMS0iIDw8IHN0ZDo6ZW5kbDsKICAgICAgICBNeUNsYXNzIGEsYixjOwogICAgICAgIGM9YS1iOwogICAgfQogICAgewogICAgICAgIHN0ZDo6Y291dCA8PCAiVGVzdCAyKyIgPDwgc3RkOjplbmRsOwogICAgICAgIE15Q2xhc3MgYSxiOwogICAgICAgIE15Q2xhc3MgYz1hK2I7CiAgICB9CiAgICB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJUZXN0IDItIiA8PCBzdGQ6OmVuZGw7CiAgICAgICAgTXlDbGFzcyBhLGI7CiAgICAgICAgTXlDbGFzcyBjPWEtYjsKICAgIH0KICAgIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgIlRlc3QgMysiIDw8IHN0ZDo6ZW5kbDsKICAgICAgICBNeUNsYXNzIGE9c29tZXRoaW5nKCksYj1zb21ldGhpbmcoKTsKICAgICAgICBNeUNsYXNzIGM9YStiOwogICAgfQogICAgewogICAgICAgIHN0ZDo6Y291dCA8PCAiVGVzdCAzLSIgPDwgc3RkOjplbmRsOwogICAgICAgIE15Q2xhc3MgYT1zb21ldGhpbmcoKSxiPXNvbWV0aGluZygpOwogICAgICAgIE15Q2xhc3MgYz1hLWI7CiAgICB9CiAgICB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJUZXN0IDQrIiA8PCBzdGQ6OmVuZGw7CiAgICAgICAgTXlDbGFzcyBjPXNvbWV0aGluZygpK3NvbWV0aGluZygpOwogICAgfQogICAgewogICAgICAgIHN0ZDo6Y291dCA8PCAiVGVzdCA0LSIgPDwgc3RkOjplbmRsOwogICAgICAgIE15Q2xhc3MgYz1zb21ldGhpbmcoKS1zb21ldGhpbmcoKTsKICAgIH0KICAgIHJldHVybiAwOwp9