#include <iostream>
class String
{
char* data;
int len;
public:
// Normal rule of three applied up here.
void swap(String& rhs) throw()
{
std::swap(data, rhs.data);
std::swap(len, rhs.len);
}
String& operator=(const String& rhs) // Standard Copy and swap.
{
//rhs.swap(*this);
return *this;
}
// New Stuff here.
// Move constructor
String(String&& cpy) throw() // ignore old throw construct for now.
: data(NULL)
, len(0)
{
*this = std::forward<String>(cpy);
}
String& operator=(String&& rhs) noexcept
{
rhs.swap(*this);
return *this;
}
};
int main()
{
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKY2xhc3MgU3RyaW5nCiB7CiAgICAgY2hhciogICBkYXRhOwogICAgIGludCAgICAgbGVuOwogICAgIHB1YmxpYzoKICAgICAgICAgLy8gTm9ybWFsIHJ1bGUgb2YgdGhyZWUgYXBwbGllZCB1cCBoZXJlLgogICAgICAgICB2b2lkIHN3YXAoU3RyaW5nJiByaHMpIHRocm93KCkKICAgICAgICAgewogICAgICAgICAgICBzdGQ6OnN3YXAoZGF0YSwgcmhzLmRhdGEpOwogICAgICAgICAgICBzdGQ6OnN3YXAobGVuLCAgcmhzLmxlbik7CiAgICAgICAgIH0KICAgICAgICAgU3RyaW5nJiBvcGVyYXRvcj0oY29uc3QgU3RyaW5nJiByaHMpIC8vIFN0YW5kYXJkIENvcHkgYW5kIHN3YXAuIAogICAgICAgICB7CiAgICAgICAgICAgIC8vcmhzLnN3YXAoKnRoaXMpOwogICAgICAgICAgICByZXR1cm4gKnRoaXM7CiAgICAgICAgIH0KCiAgICAgICAgIC8vIE5ldyBTdHVmZiBoZXJlLgogICAgICAgICAvLyBNb3ZlIGNvbnN0cnVjdG9yCiAgICAgICAgIFN0cmluZyhTdHJpbmcmJiBjcHkpIHRocm93KCkgICAgLy8gaWdub3JlIG9sZCB0aHJvdyBjb25zdHJ1Y3QgZm9yIG5vdy4gIAogICAgICAgICAgICA6IGRhdGEoTlVMTCkKICAgICAgICAgICAgLCBsZW4oMCkKICAgICAgICAgewogICAgICAgICAgICAqdGhpcyA9IHN0ZDo6Zm9yd2FyZDxTdHJpbmc+KGNweSk7CiAgICAgICAgIH0KICAgICAgICAgU3RyaW5nJiBvcGVyYXRvcj0oU3RyaW5nJiYgcmhzKSBub2V4Y2VwdCAKICAgICAgICAgewogICAgICAgICAgICByaHMuc3dhcCgqdGhpcyk7CiAgICAgICAgICAgIHJldHVybiAqdGhpczsKICAgICAgICAgfQp9OwoKaW50IG1haW4oKSAKewoJcmV0dXJuIDA7Cn0=