Le type suivant doit faire partie de l'espace
  de noms 
encap dans le fichier 
no_copy.hpp :
  
class DataSet
{
public:
  DataSet(std::vector<int> values)
  : values_{std::move(values)}
  {
    // (empty) constructor body
  }
  // ...
  int
  length() const
  {
    return int(size(values_));
  }
private:
  std::vector<int> values_;
};
 
Il s'agit d'une part de compléter ce type afin que :
- les opérations de recopie soient interdites,
 
- les versions automatiquement générées des opérations de déplacement
    soient autorisées.
 
 
D'autre part, il faut réaliser, dans le fichier 
prog_ex0403.cpp, cette
  fonction :
  
void
test_DataSet()
{
  std::cout << "\n~~~~ " << __func__ << "() ~~~~\n";
  s4prc::DataSet ds1{{10, 20, 30, 40, 50}};
  std::cout << "before: ds1.length()=" << ds1.length() << '\n';
  // ...copy-construct ds2 from ds1... (should be rejected)
  // ...move-construct ds2 from ds1...
  // ...display the length of ds1 and ds2...
  std::cout << "----\n";
  s4prc::DataSet ds3{{10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130}};
  // ...display the length of ds2 and ds3...
  // ...copy-assign ds3 from ds2... (should be rejected)
  // ...move-assign ds3 from ds2...
  // ...display the length of ds2 and ds3...
}
  qui sera appelée depuis la fonction 
main().
Il faut la compléter en suivant les commentaires afin de vérifier que
  le contrôle des opérations de recopie et de déplacement sur le type
  
DataSet opère comme prévu.
Les tentatives de recopie, qui seront rejetées par le compilateur,
  devront être conservées sous forme de commentaires afin de rester
  lisibles pour mémoire.
Les affichages doivent indiquer lisiblement l'effet des opérations
  autorisées.