//clang 6.0.0
#include <memory>
class BigData
{
// Only a builder can create data
friend class Builder;
BigData( ) = default ;
public :
// Move only
BigData( BigData&& ) = default ;
} ;
class Builder
{
BigData Data;
public :
const BigData&& Build( ) & { return std:: move ( Data) ; }
// Functions to set up data go here
} ;
class Wrapper
{
const BigData Data;
public :
Wrapper( const BigData&& In ) : Data( std:: move ( In) ) { }
// Functions to query data go here
} ;
std:: unique_ptr < Wrapper> DoBuild( )
{
Builder b;
// call functions on b to set up data here
return std:: make_unique < Wrapper> ( b.Build ( ) ) ;
}
int main( )
{
auto wrapper = DoBuild( ) ;
}
Ly9jbGFuZyA2LjAuMAoKI2luY2x1ZGUgPG1lbW9yeT4KCmNsYXNzIEJpZ0RhdGEKewogICAgLy8gT25seSBhIGJ1aWxkZXIgY2FuIGNyZWF0ZSBkYXRhCglmcmllbmQgY2xhc3MgQnVpbGRlcjsKCUJpZ0RhdGEoKSA9IGRlZmF1bHQ7CnB1YmxpYzoKICAgIC8vIE1vdmUgb25seQogICAgQmlnRGF0YSggQmlnRGF0YSYmICkgPSBkZWZhdWx0Owp9OwoKY2xhc3MgQnVpbGRlcgp7CiAgICBCaWdEYXRhIERhdGE7CnB1YmxpYzoKICAgIGNvbnN0IEJpZ0RhdGEmJiBCdWlsZCgpICYgeyByZXR1cm4gc3RkOjptb3ZlKERhdGEpOyB9CiAgICAvLyBGdW5jdGlvbnMgdG8gc2V0IHVwIGRhdGEgZ28gaGVyZQp9OwoKY2xhc3MgV3JhcHBlcgp7CiAgICBjb25zdCBCaWdEYXRhIERhdGE7CnB1YmxpYzoKICAgIFdyYXBwZXIoIGNvbnN0IEJpZ0RhdGEmJiBJbiApIDogRGF0YSggc3RkOjptb3ZlKEluKSApIHt9CiAgICAKICAgIC8vIEZ1bmN0aW9ucyB0byBxdWVyeSBkYXRhIGdvIGhlcmUKfTsKCnN0ZDo6dW5pcXVlX3B0cjxXcmFwcGVyPiBEb0J1aWxkKCkKewogICAgQnVpbGRlciBiOwogICAgLy8gY2FsbCBmdW5jdGlvbnMgb24gYiB0byBzZXQgdXAgZGF0YSBoZXJlCiAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxXcmFwcGVyPiggYi5CdWlsZCgpICk7Cn0KCmludCBtYWluKCkKewogICAgYXV0byB3cmFwcGVyID0gRG9CdWlsZCgpOwp9
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