Nantucket
Nantucket

Reputation: 1697

C++: When is a class implicitly copied?

When is a class implicitly copied in C++?

I have a class that contains a unique_ptr, and therefore cannot be safely copied, and therefore, I disabled the copy constructor on the class by creating private versions of X(X&) and X& operator = X&.

I immediately ran into the problem that instances of this class cannot be returned, because returning actually makes a copy of the instance.

Are there any other situations I need to watch out for?

Upvotes: 2

Views: 200

Answers (2)

Puppy
Puppy

Reputation: 146910

Returning does not copy the instance, it moves the instance. You just forgot to provide a move constructor. In addition, classes are now moved when used in Standard containers in most situations in which they used to be copied.

In short, provide a move constructor and move assignment operator (and swap, preferably) and you should find that almost all situations where copies are implicit, they're now moves.

Upvotes: 3

Mooing Duck
Mooing Duck

Reputation: 66912

The situations that come to mind are: functions that receives the class by value, functions that returns then class by value, and any class or container that contains that class. Classes like std::vector will use move semantics whenever possible (you did overload that right)? but will be unable to use functions that require a copy constructor, such as copying the vector. As GMan said though, you can make a copy constructor for your class, and do a deep copy of the std::unique_ptr manually, if you want to make things easier.

Upvotes: 2

Related Questions