3 ms·
> The move constructor is the important bit. Its presence tells C++ that this class can not be copied, only moved Is that true? I thought move ctor enabled mov
by mikec3010 8y ago
> The move constructor is the important bit. Its presence tells C++ that this class can not be copied, only moved
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.
- ahubert 8y ago(author here), it is true, try it. Sample code is on https://github.com/ahupowerdns/hello-cpp/blob/master/move.cc https://github.com/ahupowerdns/hello-cpp/blob/master/move.cc
- mikec3010 8y agoThanks, and sorry for not just trying it. I'm on mobile and our workstations here aren't cpp11 capable.
- datamart 8y agoThe implicitly-declared copy constructor is deleted if there is a user-defined move constructor. See: https://en.cppreference.com/w/cpp/language/copy_constructor#Deleted_implicitly-declared_copy_constructor 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.
- mikec3010 8y agoThat makes sense, and hence the "rule of 5" (if you don't want it implicitly deleted). Thanks.
- microtherion 8y agoLuckily, 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;
- tlb 8y ago"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 https://en.cppreference.com/w/cpp/language/copy_constructor But there's no harm in explicitly deleting it, and it helps document the intent.
- _pmf_ 8y agoWhat's the motivation behind this?
- tlb 8y agoThe 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.
- deleted 8y ago[deleted]