I have a big class holding a lot of STL containers.
Will the compiler automatically make a move constructor that will move those containers to the target or I have to make my own?
Asked
Active
Viewed 1.1k times
37
![](../../users/profiles/46642.webp)
R. Martinho Fernandes
- 209,766
- 68
- 412
- 492
![](../../users/profiles/362589.webp)
Dani
- 27,760
- 14
- 76
- 131
2 Answers
54
A move constructor for a class X is implicitly declared as defaulted exactly when
- X does not have a user-declared copy constructor,
- X does not have a user-declared copy assignment operator,
- X does not have a user-declared move assignment operator,
- X does not have a user-declared destructor, and
- the move constructor would not be implicitly defined as deleted.
So for example, if your class has a class type data member that does not have a move constructor, your class will not get a move constructor even if it doesn't have any copy/move constructor declared, because the implicitly declared move constructor would be defined as deleted (because of that data member).
![](../../users/profiles/34509.webp)
Johannes Schaub - litb
- 466,055
- 116
- 851
- 1,175
-
6Interestingly, a user-declared move-constructor does not prevent the compiler from implicitly declaring a copy constructor. Maybe, that is worth mentioning here. At least this is what http://www.cprogramming.com/c++11/rvalue-references-and-move-semantics-in-c++11.html says. – Tobias Apr 28 '14 at 07:32
-
7It's interesting that **all** members are required to have a move constructor. It seems sane to move all the members that can be moved and copy the ones that can't. – Kevin Cox Aug 12 '14 at 18:11
-
1So the best shot is to define move ctor for yourself, don't rely on compiler. – Deqing Sep 22 '16 at 02:34
-
And the said class member would not have an implicit move constructor because one or more of the items in the above list was not met. – wulfgarpro Mar 08 '17 at 23:18
-
@KevinCox It is common to guarantee that a move constructor does not throw an exception, while a copy constructor often can (e.g. out of memory), so this might not be a good idea. You could argue "that's ok, the implicit move constructor just wouldn't be noexcept" but I still think there's potential for surprise (i.e. bugs). – Arthur Tacca Aug 25 '17 at 09:35
-
So, if I move a class that doesn't have automatically generated move constructor, then automatically generated copy constructor is used? :/ – anton_rh Feb 06 '18 at 13:39
-
It's probably better to use explicitly defaulted move constructors: https://stackoverflow.com/questions/18290523/is-a-default-move-constructor-equivalent-to-a-member-wise-move-constructor – anton_rh Feb 06 '18 at 13:49
3
Default move constructors are generally tied to default copy constructors. You get one when you get the other. However, if you write a copy constructor/assignment operator, then no default copy and move constructors/assignment operators are written. If you write one of either set, you must write them all.
![](../../users/profiles/734069.webp)
Nicol Bolas
- 378,677
- 53
- 635
- 829