Why does the insertion of user defined destructor require an user defined copy constructor

后端 未结 2 398
走了就别回头了
走了就别回头了 2021-01-21 02:10

The following code compiles:

#include 
#include 
#include 

using namespace std;

class container
{
public:
    conta         


        
相关标签:
2条回答
  • 2021-01-21 03:02

    The code gets compiled because buildShip() would use the move constructor automatically generated by the compiler when returning tmp. Adding user-declared destructor prevents the compiler from auto-generating one. E.g., see this or this questions. And the compiler-generated copy constructor can not be used because of the member up which is std::unique_ptr. And copy constuctor of unique_ptr is explicitly deleted.

    So this will compile, because the compiler is explicitly asked to generate the move constructor:

    class Ship
    {
    public:
        Ship(){}
        Ship(Ship&&) = default;
        ~Ship(){}
        std::unique_ptr<container> up;
    };
    
    0 讨论(0)
  • 2021-01-21 03:04

    The idea is that, if the compiler-generated destructor is not good enough for your class, then chances are the copy constructor and copy assignment operator are also not good enough, so the compiler may delete the implicit implementations of those copy operations. Technically, the compiler may still give you implicit copy operations even if you have a user-defined destructor, but that behavior is deprecated in c++11.

    See Rule of Three

    AFAIK, you still need a copy constructor because buildShip() returns by value.

    (However, it's interesting that you are able to compile the versions that use an implicit copy constructor. You shouldn't be able to do that because of the unique_ptr member...)

    0 讨论(0)
提交回复
热议问题