mercredi 3 octobre 2018

Why move constructor is generated when user-declared destructor is present?

Following this answer (https://stackoverflow.com/a/19826645/10453696) and the specification (https://en.cppreference.com/w/cpp/language/move_constructor), there should be no implicit move constructor or move assignment operator.

However, the following code still compiles in gcc 7.2.1:

#include <vector>
#include <iostream>
using namespace std;

struct NoCopyNoMove
{
    NoCopyNoMove(const NoCopyNoMove&) = delete;
    NoCopyNoMove& operator=(const NoCopyNoMove&) = delete;
    NoCopyNoMove(NoCopyNoMove&&) = delete;
    NoCopyNoMove& operator=(NoCopyNoMove&&) = delete;

    NoCopyNoMove(int){};
};

struct NoCopy
{
    NoCopy(const NoCopyNoMove&) = delete;
    NoCopy& operator=(const NoCopyNoMove&) = delete;
    // NoCopy(NoCopy&&) = delete;
    // NoCopy& operator=(NoCopy&&) = delete;
    ~NoCopy() {
        std::cout << "decontructor" << std::endl;
    }
    NoCopy(int){};
};

int main()
{

    // vector<NoCopyNoMove> y; // fails!
    vector<NoCopy> y;
    y.emplace_back(1);
    y.emplace_back(2);
}

Aucun commentaire:

Enregistrer un commentaire