Following this answer and this move-constructor specification, 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);
}