fork(1) download
  1. //clang 6.0.0
  2.  
  3. #include <memory>
  4.  
  5. class BigData
  6. {
  7. // Only a builder can create data
  8. friend class Builder;
  9. BigData() = default;
  10. public:
  11. // Move only
  12. BigData( BigData&& ) = default;
  13. };
  14.  
  15. class Builder
  16. {
  17. BigData Data;
  18. public:
  19. const BigData&& Build() & { return std::move(Data); }
  20. // Functions to set up data go here
  21. };
  22.  
  23. class Wrapper
  24. {
  25. const BigData Data;
  26. public:
  27. Wrapper( const BigData&& In ) : Data( std::move(In) ) {}
  28.  
  29. // Functions to query data go here
  30. };
  31.  
  32. std::unique_ptr<Wrapper> DoBuild()
  33. {
  34. Builder b;
  35. // call functions on b to set up data here
  36. return std::make_unique<Wrapper>( b.Build() );
  37. }
  38.  
  39. int main()
  40. {
  41. auto wrapper = DoBuild();
  42. }
Compilation error #stdin compilation error #stdout 0s 4280KB
stdin
Standard input is empty
compilation info
prog.cpp: In constructor ‘Wrapper::Wrapper(const BigData&&)’:
prog.cpp:27:57: error: use of deleted function ‘constexpr BigData::BigData(const BigData&)’
     Wrapper( const BigData&& In ) : Data( std::move(In) ) {}
                                                         ^
prog.cpp:5:7: note: ‘constexpr BigData::BigData(const BigData&)’ is implicitly declared as deleted because ‘BigData’ declares a move constructor or move assignment operator
 class BigData
       ^~~~~~~
stdout
Standard output is empty