![Page 1: Everything You Ever Wanted to Know About Move Semantics, Howard Hinnant, Accu 2014](https://reader034.vdocument.in/reader034/viewer/2022042715/55941f861a28ab45128b45fb/html5/thumbnails/1.jpg)
Everything You Ever Wanted To Know About
Move Semantics
Howard Hinnant Senior Software Engineer
Ripple Labs !
April 12, 2014
(and then some)
![Page 2: Everything You Ever Wanted to Know About Move Semantics, Howard Hinnant, Accu 2014](https://reader034.vdocument.in/reader034/viewer/2022042715/55941f861a28ab45128b45fb/html5/thumbnails/2.jpg)
• The genesis of move semantics • Special member functions • Introduction to the special move members
Outline
![Page 3: Everything You Ever Wanted to Know About Move Semantics, Howard Hinnant, Accu 2014](https://reader034.vdocument.in/reader034/viewer/2022042715/55941f861a28ab45128b45fb/html5/thumbnails/3.jpg)
How Did Move Semantics Get Started?
• It was all about optimizing std::vector<T>. • And everything else just rode along on its coattails.
![Page 4: Everything You Ever Wanted to Know About Move Semantics, Howard Hinnant, Accu 2014](https://reader034.vdocument.in/reader034/viewer/2022042715/55941f861a28ab45128b45fb/html5/thumbnails/4.jpg)
vector
What is std::vector?• Anatomy of a vector (simplified)
vector’s data
begin() end() capacity()
![Page 5: Everything You Ever Wanted to Know About Move Semantics, Howard Hinnant, Accu 2014](https://reader034.vdocument.in/reader034/viewer/2022042715/55941f861a28ab45128b45fb/html5/thumbnails/5.jpg)
How does a vector copy?
vector
vector’s data
vector
vector’s datacopy
![Page 6: Everything You Ever Wanted to Know About Move Semantics, Howard Hinnant, Accu 2014](https://reader034.vdocument.in/reader034/viewer/2022042715/55941f861a28ab45128b45fb/html5/thumbnails/6.jpg)
How does a vector move?
vector
vector’s data
vector
nullptr nullptr nullptr
copy
![Page 7: Everything You Ever Wanted to Know About Move Semantics, Howard Hinnant, Accu 2014](https://reader034.vdocument.in/reader034/viewer/2022042715/55941f861a28ab45128b45fb/html5/thumbnails/7.jpg)
How Did Move Semantics Get Started?
• Remember these fundamentals about move semantics and vector, and you will have a basic understanding of all of move semantics.
• The rest is just details…
![Page 8: Everything You Ever Wanted to Know About Move Semantics, Howard Hinnant, Accu 2014](https://reader034.vdocument.in/reader034/viewer/2022042715/55941f861a28ab45128b45fb/html5/thumbnails/8.jpg)
Outline
• The genesis of move semantics • Special member functions • Introduction to the special move members
![Page 9: Everything You Ever Wanted to Know About Move Semantics, Howard Hinnant, Accu 2014](https://reader034.vdocument.in/reader034/viewer/2022042715/55941f861a28ab45128b45fb/html5/thumbnails/9.jpg)
Special Members
• What are they?
![Page 10: Everything You Ever Wanted to Know About Move Semantics, Howard Hinnant, Accu 2014](https://reader034.vdocument.in/reader034/viewer/2022042715/55941f861a28ab45128b45fb/html5/thumbnails/10.jpg)
Special Members
• Special members are those member functions that the compiler can be asked to automatically generate code for.
![Page 11: Everything You Ever Wanted to Know About Move Semantics, Howard Hinnant, Accu 2014](https://reader034.vdocument.in/reader034/viewer/2022042715/55941f861a28ab45128b45fb/html5/thumbnails/11.jpg)
Special Members
• How many special members are there?
6
![Page 12: Everything You Ever Wanted to Know About Move Semantics, Howard Hinnant, Accu 2014](https://reader034.vdocument.in/reader034/viewer/2022042715/55941f861a28ab45128b45fb/html5/thumbnails/12.jpg)
Special Members
• They are: • default constructor • destructor • copy constructor • copy assignment • move constructor • move assignment
X();~X();X(X const&);X& operator=(X const&);X(X&&);X& operator=(X&&);
![Page 13: Everything You Ever Wanted to Know About Move Semantics, Howard Hinnant, Accu 2014](https://reader034.vdocument.in/reader034/viewer/2022042715/55941f861a28ab45128b45fb/html5/thumbnails/13.jpg)
Special Members
• The special members can be: • not declared • implicitly declared • user declared
defaulted
deleted
user-defined
ororor
![Page 14: Everything You Ever Wanted to Know About Move Semantics, Howard Hinnant, Accu 2014](https://reader034.vdocument.in/reader034/viewer/2022042715/55941f861a28ab45128b45fb/html5/thumbnails/14.jpg)
Special Members• What counts as user-declared?
struct X{ X() {} // user-declared!
!
!
};
X(); // user-declaredX() = default; // user-declaredX() = delete; // user-declared
![Page 15: Everything You Ever Wanted to Know About Move Semantics, Howard Hinnant, Accu 2014](https://reader034.vdocument.in/reader034/viewer/2022042715/55941f861a28ab45128b45fb/html5/thumbnails/15.jpg)
Special Members• What is the difference between
not-declared and deleted?Consider:
struct X{ template <class ...Args> X(Args&& ...args);!
!
};
// The default constructor// is not declared
![Page 16: Everything You Ever Wanted to Know About Move Semantics, Howard Hinnant, Accu 2014](https://reader034.vdocument.in/reader034/viewer/2022042715/55941f861a28ab45128b45fb/html5/thumbnails/16.jpg)
Special Members
• X can be default constructed by using the variadic constructor.
struct X{ template <class ...Args> X(Args&& ...args);!
!
};
// The default destructor// is not declared
![Page 17: Everything You Ever Wanted to Know About Move Semantics, Howard Hinnant, Accu 2014](https://reader034.vdocument.in/reader034/viewer/2022042715/55941f861a28ab45128b45fb/html5/thumbnails/17.jpg)
Special Members
• Now X() binds to the deleted default constructor instead of the variadic constructor.
• X is no longer default constructible.
struct X{ template <class ...Args> X(Args&& ...args);!
!
};X() = delete;
![Page 18: Everything You Ever Wanted to Know About Move Semantics, Howard Hinnant, Accu 2014](https://reader034.vdocument.in/reader034/viewer/2022042715/55941f861a28ab45128b45fb/html5/thumbnails/18.jpg)
Special Members
• Deleted members participate in overload resolution. • Members not-declared do not participate in
overload resolution.
struct X{ template <class ...Args> X(Args&& ...args);!
!
};X() = delete;
![Page 19: Everything You Ever Wanted to Know About Move Semantics, Howard Hinnant, Accu 2014](https://reader034.vdocument.in/reader034/viewer/2022042715/55941f861a28ab45128b45fb/html5/thumbnails/19.jpg)
Special Members
• Under what circumstances are special members implicitly provided?
![Page 20: Everything You Ever Wanted to Know About Move Semantics, Howard Hinnant, Accu 2014](https://reader034.vdocument.in/reader034/viewer/2022042715/55941f861a28ab45128b45fb/html5/thumbnails/20.jpg)
default constructor destructor copy
constructorcopy
assignmentmove
constructormove
assignment
Nothing defaulted defaulted defaulted defaulted defaulted defaulted
user
dec
lare
s
compiler implicitly declares
Special Members
• If the user declares no special members or constructors, all 6 special members will be defaulted.
• This part is no different from C++98/03
![Page 21: Everything You Ever Wanted to Know About Move Semantics, Howard Hinnant, Accu 2014](https://reader034.vdocument.in/reader034/viewer/2022042715/55941f861a28ab45128b45fb/html5/thumbnails/21.jpg)
default constructor destructor copy
constructorcopy
assignmentmove
constructormove
assignment
Nothing defaulted defaulted defaulted defaulted defaulted defaulted
user
dec
lare
s
compiler implicitly declares
Special Members
• “defaulted” can mean “deleted” if the defaulted special member would have to do something illegal, such as call another deleted function.
• Defaulted move members defined as deleted, actually behave as not declared. • No, I’m not kidding!
![Page 22: Everything You Ever Wanted to Know About Move Semantics, Howard Hinnant, Accu 2014](https://reader034.vdocument.in/reader034/viewer/2022042715/55941f861a28ab45128b45fb/html5/thumbnails/22.jpg)
default constructor destructor copy
constructorcopy
assignmentmove
constructormove
assignment
Nothing defaulted defaulted defaulted defaulted defaulted defaulted
Any constructor
not declared defaulted defaulted defaulted defaulted defaulted
user
dec
lare
s
compiler implicitly declares
Special Members
• If the user declares any non-special constructor, this will inhibit the implicit declaration of the default constructor.
![Page 23: Everything You Ever Wanted to Know About Move Semantics, Howard Hinnant, Accu 2014](https://reader034.vdocument.in/reader034/viewer/2022042715/55941f861a28ab45128b45fb/html5/thumbnails/23.jpg)
default constructor destructor copy
constructorcopy
assignmentmove
constructormove
assignment
Nothing defaulted defaulted defaulted defaulted defaulted defaulted
Any constructor
not declared defaulted defaulted defaulted defaulted defaulted
default constructor
user declared defaulted defaulted defaulted defaulted defaulted
user
dec
lare
s
compiler implicitly declares
Special Members
• A user-declared default constructor will not inhibit any other special member.
![Page 24: Everything You Ever Wanted to Know About Move Semantics, Howard Hinnant, Accu 2014](https://reader034.vdocument.in/reader034/viewer/2022042715/55941f861a28ab45128b45fb/html5/thumbnails/24.jpg)
default constructor destructor copy
constructorcopy
assignmentmove
constructormove
assignment
Nothing defaulted defaulted defaulted defaulted defaulted defaulted
Any constructor
not declared defaulted defaulted defaulted defaulted defaulted
default constructor
user declared defaulted defaulted defaulted defaulted defaulted
destructor defaulted user declared defaulted defaulted not
declarednot
declared
user
dec
lare
s
compiler implicitly declares
Special Members
• A user-declared destructor will inhibit the implicit declaration of the move members.
• The implicitly defaulted copy members are deprecated. • If you declare a destructor, declare your copy
members too, even though not necessary.
![Page 25: Everything You Ever Wanted to Know About Move Semantics, Howard Hinnant, Accu 2014](https://reader034.vdocument.in/reader034/viewer/2022042715/55941f861a28ab45128b45fb/html5/thumbnails/25.jpg)
default constructor destructor copy
constructorcopy
assignmentmove
constructormove
assignment
Nothing defaulted defaulted defaulted defaulted defaulted defaulted
Any constructor
not declared defaulted defaulted defaulted defaulted defaulted
default constructor
user declared defaulted defaulted defaulted defaulted defaulted
destructor defaulted user declared defaulted defaulted not
declarednot
declaredcopy
constructor not
declared defaulted user declared defaulted not
declarednot
declareduser
dec
lare
s
compiler implicitly declares
Special Members
• A user-declared copy constructor will inhibit the default constructor and move members.
![Page 26: Everything You Ever Wanted to Know About Move Semantics, Howard Hinnant, Accu 2014](https://reader034.vdocument.in/reader034/viewer/2022042715/55941f861a28ab45128b45fb/html5/thumbnails/26.jpg)
default constructor destructor copy
constructorcopy
assignmentmove
constructormove
assignment
Nothing defaulted defaulted defaulted defaulted defaulted defaulted
Any constructor
not declared defaulted defaulted defaulted defaulted defaulted
default constructor
user declared defaulted defaulted defaulted defaulted defaulted
destructor defaulted user declared defaulted defaulted not
declarednot
declaredcopy
constructor not
declared defaulted user declared defaulted not
declarednot
declaredcopy
assignment defaulted defaulted defaulted user declared
not declared
not declared
user
dec
lare
s
compiler implicitly declares
Special Members
• A user-declared copy assignment will inhibit the move members.
![Page 27: Everything You Ever Wanted to Know About Move Semantics, Howard Hinnant, Accu 2014](https://reader034.vdocument.in/reader034/viewer/2022042715/55941f861a28ab45128b45fb/html5/thumbnails/27.jpg)
default constructor destructor copy
constructorcopy
assignmentmove
constructormove
assignment
Nothing defaulted defaulted defaulted defaulted defaulted defaulted
Any constructor
not declared defaulted defaulted defaulted defaulted defaulted
default constructor
user declared defaulted defaulted defaulted defaulted defaulted
destructor defaulted user declared defaulted defaulted not
declarednot
declaredcopy
constructor not
declared defaulted user declared defaulted not
declarednot
declaredcopy
assignment defaulted defaulted defaulted user declared
not declared
not declared
move constructor
not declared defaulted deleted deleted user
declarednot
declared
user
dec
lare
s
compiler implicitly declares
Special Members
• A user-declared move member will implicitly delete the copy members.
![Page 28: Everything You Ever Wanted to Know About Move Semantics, Howard Hinnant, Accu 2014](https://reader034.vdocument.in/reader034/viewer/2022042715/55941f861a28ab45128b45fb/html5/thumbnails/28.jpg)
default constructor destructor copy
constructorcopy
assignmentmove
constructormove
assignment
Nothing defaulted defaulted defaulted defaulted defaulted defaulted
Any constructor
not declared defaulted defaulted defaulted defaulted defaulted
default constructor
user declared defaulted defaulted defaulted defaulted defaulted
destructor defaulted user declared defaulted defaulted not
declarednot
declaredcopy
constructor not
declared defaulted user declared defaulted not
declarednot
declaredcopy
assignment defaulted defaulted defaulted user declared
not declared
not declared
move constructor
not declared defaulted deleted deleted user
declarednot
declaredmove
assignment defaulted defaulted deleted deleted not declared
user declared
user
dec
lare
s
compiler implicitly declares
Special Members
![Page 29: Everything You Ever Wanted to Know About Move Semantics, Howard Hinnant, Accu 2014](https://reader034.vdocument.in/reader034/viewer/2022042715/55941f861a28ab45128b45fb/html5/thumbnails/29.jpg)
default constructor destructor copy
constructorcopy
assignment
Nothing defaulted defaulted defaulted defaulted
Any constructor
not declared defaulted defaulted defaulted
default constructor
user declared defaulted defaulted defaulted
destructor defaulted user declared defaulted defaulted
copy constructor
not declared defaulted user
declared defaulted
copy assignment defaulted defaulted defaulted user
declared
user
dec
lare
s
compiler implicitly declares
Special Members
This is C++98/03
![Page 30: Everything You Ever Wanted to Know About Move Semantics, Howard Hinnant, Accu 2014](https://reader034.vdocument.in/reader034/viewer/2022042715/55941f861a28ab45128b45fb/html5/thumbnails/30.jpg)
default constructor destructor copy
constructorcopy
assignmentmove
constructormove
assignment
Nothing defaulted defaulted defaulted defaulted defaulted defaulted
Any constructor
not declared defaulted defaulted defaulted defaulted defaulted
default constructor
user declared defaulted defaulted defaulted defaulted defaulted
destructor defaulted user declared defaulted defaulted not
declarednot
declaredcopy
constructor not
declared defaulted user declared defaulted not
declarednot
declaredcopy
assignment defaulted defaulted defaulted user declared
not declared
not declared
move constructor
not declared defaulted deleted deleted user
declarednot
declaredmove
assignment defaulted defaulted deleted deleted not declared
user declared
user
dec
lare
s
compiler implicitly declares
Special Members
![Page 31: Everything You Ever Wanted to Know About Move Semantics, Howard Hinnant, Accu 2014](https://reader034.vdocument.in/reader034/viewer/2022042715/55941f861a28ab45128b45fb/html5/thumbnails/31.jpg)
class X{public:!
!
!
!
!
!
};
X() = default;~X() = default;X(X const&) = default;X& operator=(X const&) = default;
X& operator=(X&&) = default;X(X&&) = default;
Special MembersAn alternate presentation of the same information.
![Page 32: Everything You Ever Wanted to Know About Move Semantics, Howard Hinnant, Accu 2014](https://reader034.vdocument.in/reader034/viewer/2022042715/55941f861a28ab45128b45fb/html5/thumbnails/32.jpg)
class X{public:!
!
!
!
!
!
};
X() = default;~X() = default;X(X const&) = default;X& operator=(X const&) = default;
X& operator=(X&&) = default;X(X&&) = default;
Special MembersAn alternate presentation of the same information.
![Page 33: Everything You Ever Wanted to Know About Move Semantics, Howard Hinnant, Accu 2014](https://reader034.vdocument.in/reader034/viewer/2022042715/55941f861a28ab45128b45fb/html5/thumbnails/33.jpg)
class X{public:!
!
!
!
!
!
};
X() = default;~X() = default;X(X const&) = default;X& operator=(X const&) = default;
Special MembersAn alternate presentation of the same information.
![Page 34: Everything You Ever Wanted to Know About Move Semantics, Howard Hinnant, Accu 2014](https://reader034.vdocument.in/reader034/viewer/2022042715/55941f861a28ab45128b45fb/html5/thumbnails/34.jpg)
class X{public:!
!
!
!
!
!
};
~X() = default;X(X const&) = default;X& operator=(X const&) = default;
Special MembersAn alternate presentation of the same information.
![Page 35: Everything You Ever Wanted to Know About Move Semantics, Howard Hinnant, Accu 2014](https://reader034.vdocument.in/reader034/viewer/2022042715/55941f861a28ab45128b45fb/html5/thumbnails/35.jpg)
class X{public:!
!
!
!
!
!
};
X() = default;~X() = default;X(X const&) = default;X& operator=(X const&) = default;
Special MembersAn alternate presentation of the same information.
![Page 36: Everything You Ever Wanted to Know About Move Semantics, Howard Hinnant, Accu 2014](https://reader034.vdocument.in/reader034/viewer/2022042715/55941f861a28ab45128b45fb/html5/thumbnails/36.jpg)
class X{public:!
!
!
!
!
!
};
~X() = default;X(X const&) = delete;X& operator=(X const&) = delete;X(X&&) = default;
Special MembersAn alternate presentation of the same information.
![Page 37: Everything You Ever Wanted to Know About Move Semantics, Howard Hinnant, Accu 2014](https://reader034.vdocument.in/reader034/viewer/2022042715/55941f861a28ab45128b45fb/html5/thumbnails/37.jpg)
class X{public:!
!
!
!
!
!
};
X() = default;~X() = default;X(X const&) = delete;X& operator=(X const&) = delete;
X& operator=(X&&) = default;
Special MembersAn alternate presentation of the same information.
![Page 38: Everything You Ever Wanted to Know About Move Semantics, Howard Hinnant, Accu 2014](https://reader034.vdocument.in/reader034/viewer/2022042715/55941f861a28ab45128b45fb/html5/thumbnails/38.jpg)
Outline
• The genesis of move semantics • Special member functions • Introduction to the special move members
![Page 39: Everything You Ever Wanted to Know About Move Semantics, Howard Hinnant, Accu 2014](https://reader034.vdocument.in/reader034/viewer/2022042715/55941f861a28ab45128b45fb/html5/thumbnails/39.jpg)
What does a defaulted move constructor do?
class X : public Base{ Member m_;!
X(X&& x) : Base(static_cast<Base&&>(x)) , m_(static_cast<Member&&>(x.m_)) {}};
![Page 40: Everything You Ever Wanted to Know About Move Semantics, Howard Hinnant, Accu 2014](https://reader034.vdocument.in/reader034/viewer/2022042715/55941f861a28ab45128b45fb/html5/thumbnails/40.jpg)
What does a typical user-defined move constructor do?class X : public Base{ Member m_;!
X(X&& x) : Base(std::move(x)) , m_(std::move(x.m_)) { x.set_to_resourceless_state(); }
![Page 41: Everything You Ever Wanted to Know About Move Semantics, Howard Hinnant, Accu 2014](https://reader034.vdocument.in/reader034/viewer/2022042715/55941f861a28ab45128b45fb/html5/thumbnails/41.jpg)
What does a defaulted move assignment do?
class X : public Base{ Member m_;!
X& operator=(X&& x) { Base::operator= (static_cast<Base&&>(x)); m_ = static_cast<Member&&>(x.m_); return *this; }
![Page 42: Everything You Ever Wanted to Know About Move Semantics, Howard Hinnant, Accu 2014](https://reader034.vdocument.in/reader034/viewer/2022042715/55941f861a28ab45128b45fb/html5/thumbnails/42.jpg)
What does a typical user-defined move assignment do?class X : public Base{ Member m_;!
X& operator=(X&& x) { Base::operator=(std::move(x)); m_ = std::move(x.m_); x.set_to_resourceless_state(); return *this; }
![Page 43: Everything You Ever Wanted to Know About Move Semantics, Howard Hinnant, Accu 2014](https://reader034.vdocument.in/reader034/viewer/2022042715/55941f861a28ab45128b45fb/html5/thumbnails/43.jpg)
Can I define one special member in terms of another?
Yes.
![Page 44: Everything You Ever Wanted to Know About Move Semantics, Howard Hinnant, Accu 2014](https://reader034.vdocument.in/reader034/viewer/2022042715/55941f861a28ab45128b45fb/html5/thumbnails/44.jpg)
Should I define one special member in terms of another?
No!
![Page 45: Everything You Ever Wanted to Know About Move Semantics, Howard Hinnant, Accu 2014](https://reader034.vdocument.in/reader034/viewer/2022042715/55941f861a28ab45128b45fb/html5/thumbnails/45.jpg)
Should I define one special member in terms of another?
No!
• Give each special member the tender loving care it deserves.
• The entire point of move semantics is to boost performance.
![Page 46: Everything You Ever Wanted to Know About Move Semantics, Howard Hinnant, Accu 2014](https://reader034.vdocument.in/reader034/viewer/2022042715/55941f861a28ab45128b45fb/html5/thumbnails/46.jpg)
Should I define one special member in terms of another?Case study: the copy/swap idiom
class X{ std::vector<int> v_;public: X& operator=(X x) { // Implements v_.swap(x.v_); // both copy and return *this; // move assignment }}; What’s not to love?
![Page 47: Everything You Ever Wanted to Know About Move Semantics, Howard Hinnant, Accu 2014](https://reader034.vdocument.in/reader034/viewer/2022042715/55941f861a28ab45128b45fb/html5/thumbnails/47.jpg)
Should I define one special member in terms of another?Case study: the copy/swap idiom
class X{ std::vector<int> v_;public: X& operator=(X const& x); X& operator=(X&& x);};
I’ve written highly optimized versions of the copy and move assignment operators.
![Page 48: Everything You Ever Wanted to Know About Move Semantics, Howard Hinnant, Accu 2014](https://reader034.vdocument.in/reader034/viewer/2022042715/55941f861a28ab45128b45fb/html5/thumbnails/48.jpg)
Should I define one special member in terms of another?Case study: the copy/swap idiom
11.11.21.31.41.51.61.71.81.9
2
0% 25% 50% 75% 100%How often is lhs capacity sufficient?
copy
/sw
ap p
enal
ty
Best case (same speed)
Average case (70% slower)
Worst case (almost 8 times slower)
Speed of optimized copy assignment operator vs “copy/swap” assignment
lhs always needs to reallocate vector
lhs never needs to reallocate vector
![Page 49: Everything You Ever Wanted to Know About Move Semantics, Howard Hinnant, Accu 2014](https://reader034.vdocument.in/reader034/viewer/2022042715/55941f861a28ab45128b45fb/html5/thumbnails/49.jpg)
Should I define one special member in terms of another?Case study: the copy/swap idiom
How hard is it to make separate optimized copy and move assignment operators for this case?
![Page 50: Everything You Ever Wanted to Know About Move Semantics, Howard Hinnant, Accu 2014](https://reader034.vdocument.in/reader034/viewer/2022042715/55941f861a28ab45128b45fb/html5/thumbnails/50.jpg)
Should I define one special member in terms of another?Case study: the copy/swap idiom
class X{ std::vector<int> v_;public: // Just keep your grubby fingers // off of the keyboard. // The defaults are optimal!!
}; What’s not to love?
![Page 51: Everything You Ever Wanted to Know About Move Semantics, Howard Hinnant, Accu 2014](https://reader034.vdocument.in/reader034/viewer/2022042715/55941f861a28ab45128b45fb/html5/thumbnails/51.jpg)
Should I define one special member in terms of another?Case study: the copy/swap idiom
But the copy/swap idiom gives me strong exception safety!
Good point. Are all of your clients willing to pay a giant performance penalty for strong exception safety on assignment?
![Page 52: Everything You Ever Wanted to Know About Move Semantics, Howard Hinnant, Accu 2014](https://reader034.vdocument.in/reader034/viewer/2022042715/55941f861a28ab45128b45fb/html5/thumbnails/52.jpg)
Should I define one special member in terms of another?Case study: the copy/swap idiomPerhaps you could interest the portion of your clients that do need strong exception safety in this generic function:template <class C>C& strong_assign(C& dest, C src) { using std::swap; swap(dest, src); return dest;}
![Page 53: Everything You Ever Wanted to Know About Move Semantics, Howard Hinnant, Accu 2014](https://reader034.vdocument.in/reader034/viewer/2022042715/55941f861a28ab45128b45fb/html5/thumbnails/53.jpg)
Should I define one special member in terms of another?Case study: the copy/swap idiom
Now clients who need speed can:x = y;
And clients who need strong exception safety can:
strong_assign(x, y);
![Page 54: Everything You Ever Wanted to Know About Move Semantics, Howard Hinnant, Accu 2014](https://reader034.vdocument.in/reader034/viewer/2022042715/55941f861a28ab45128b45fb/html5/thumbnails/54.jpg)
In A Hurry?• If you don’t have time to carefully consider all 6
special members, then just delete the copy members:
class X{public: X(X const&) = delete; X& operator=(X const&) = delete;};
![Page 55: Everything You Ever Wanted to Know About Move Semantics, Howard Hinnant, Accu 2014](https://reader034.vdocument.in/reader034/viewer/2022042715/55941f861a28ab45128b45fb/html5/thumbnails/55.jpg)
Summary
• Know when the compiler is defaulting or deleting special members for you, and what defaulted members will do.
• Always define or delete a special member when the compiler’s implicit action is not correct.
• Give tender loving care to each of the 6 special members, even if the result is to let the compiler handle it.