41

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?

R. Martinho Fernandes
  • 228,013
  • 71
  • 433
  • 510
Daniel
  • 30,896
  • 18
  • 85
  • 139

2 Answers2

63

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).

Johannes Schaub - litb
  • 496,577
  • 130
  • 894
  • 1,212
  • 6
    Interestingly, 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
  • 8
    It'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
  • 1
    So 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
  • 1
    @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
  • 1
    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
4

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.

Nicol Bolas
  • 449,505
  • 63
  • 781
  • 982