"The implicitly-declared or defaulted copy constructor for class T is defined as deleted if any of the following conditions are true ... T has a user-defined move constructor or move assignment operator" (since C++11)
https://en.cppreference.com/w/cpp/language/copy_constructor
But there's no harm in explicitly deleting it, and it helps document the intent.
What's the motivation behind this?
The committee probably observed that in most cases where people wanted a move constructor, they needed either no copy constructor or a more complicated one (to handle duplicating a resource.) So creating a default copy constructor (a convenience in the common case of a simple structure) wasn't a win.
Perhaps if you were designing C++ from scratch without legacy and had a more Python-like mindset, you'd require an explicit "= default" rather than complicated rules about whether a default is provided for you or not.
The implicitly-declared copy constructor is deleted if there is a user-defined move constructor. See: https://en.cppreference.com/w/cpp/language/copy_constructor#...
So if you define a move constructor and still want your class to have a copy constructor, you'll have to explicitly define the copy constructor, too.
Re:Modern C++ for C Programmers: part 5
by microtherion on Wednesday July 25, 2018 @12:28PM
(#17610481)
Luckily, in modern C++, defining the copy constructor in this case (where you just want to make the default available) is as simple as:
A::A(const A &other) = default;
Re:Modern C++ for C Programmers: part 5
by mikec3010 on Wednesday July 25, 2018 @11:14AM
(#17609884)
That makes sense, and hence the "rule of 5" (if you don't want it implicitly deleted). Thanks.
(author here), it is true, try it. Sample code is on https://github.com/ahupowerdns/hello-cpp/blob/master/move.cc
Is that true? I thought move ctor enabled move semantics, but if you pass by value the copy ctor was still called (except in places where RVO makes sense). And I thought to disable copying you made the copy ctor = delete.