rvalue.cpp
This commit is contained in:
239
cpp/rvalue.cpp
Normal file
239
cpp/rvalue.cpp
Normal file
@@ -0,0 +1,239 @@
|
|||||||
|
/*
|
||||||
|
VIM: let g:lcppflags="-std=c++11 -O2 -pthread"
|
||||||
|
VIM: let g:wcppflags="/O2 /EHsc /DWIN32"
|
||||||
|
VIM: let g:argv=""
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
class copy_tracker
|
||||||
|
{
|
||||||
|
int v;
|
||||||
|
public:
|
||||||
|
copy_tracker()
|
||||||
|
: v(0)
|
||||||
|
{
|
||||||
|
// std::cout << "copy_tracker::copy_tracker()" << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
copy_tracker( const copy_tracker& c )
|
||||||
|
: v( c.v )
|
||||||
|
{
|
||||||
|
std::cout << "copy_tracker::copy_tracker( copy_tracker& c )" << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
int use_object() const
|
||||||
|
{
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
|
void non_const_method()
|
||||||
|
{
|
||||||
|
v++;
|
||||||
|
std::cout << "copy_tracker::non_const_method()" << std::endl;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* e
|
||||||
|
*/
|
||||||
|
#if 0
|
||||||
|
// uncommenting this will cause compiler error due to ambiguity.
|
||||||
|
void e ( copy_tracker o )
|
||||||
|
{
|
||||||
|
std::cout << "e( ) by value called" << std::endl;
|
||||||
|
o.use_object();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void e ( copy_tracker& o )
|
||||||
|
{
|
||||||
|
std::cout << "e( & ) is called" << std::endl;
|
||||||
|
o.use_object();
|
||||||
|
}
|
||||||
|
|
||||||
|
void e ( const copy_tracker& o )
|
||||||
|
{
|
||||||
|
std::cout << "e( const & ) is called" << std::endl;
|
||||||
|
o.use_object();
|
||||||
|
}
|
||||||
|
|
||||||
|
void e ( copy_tracker&& o )
|
||||||
|
{
|
||||||
|
std::cout << "e( && ) is called" << std::endl;
|
||||||
|
o.use_object();
|
||||||
|
}
|
||||||
|
|
||||||
|
void e ( const copy_tracker&& o )
|
||||||
|
{
|
||||||
|
std::cout << "e( const && ) is called" << std::endl;
|
||||||
|
o.use_object();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* f
|
||||||
|
*/
|
||||||
|
void f ( copy_tracker& o )
|
||||||
|
{
|
||||||
|
std::cout << "f( & ) is called" << std::endl;
|
||||||
|
o.use_object();
|
||||||
|
}
|
||||||
|
|
||||||
|
void f ( const copy_tracker& o )
|
||||||
|
{
|
||||||
|
std::cout << "f( const & ) is called" << std::endl;
|
||||||
|
o.use_object();
|
||||||
|
}
|
||||||
|
|
||||||
|
void f ( copy_tracker&& o )
|
||||||
|
{
|
||||||
|
std::cout << "f( && ) is called" << std::endl;
|
||||||
|
o.use_object();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* g
|
||||||
|
*/
|
||||||
|
void g ( copy_tracker& o )
|
||||||
|
{
|
||||||
|
std::cout << "g( & ) is called" << std::endl;
|
||||||
|
o.use_object();
|
||||||
|
}
|
||||||
|
|
||||||
|
void g ( const copy_tracker& o )
|
||||||
|
{
|
||||||
|
std::cout << "g( const & ) is called" << std::endl;
|
||||||
|
o.use_object();
|
||||||
|
}
|
||||||
|
|
||||||
|
void g ( const copy_tracker&& o )
|
||||||
|
{
|
||||||
|
std::cout << "g( const && ) is called" << std::endl;
|
||||||
|
o.use_object();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* h
|
||||||
|
*/
|
||||||
|
void h ( copy_tracker& o )
|
||||||
|
{
|
||||||
|
std::cout << "h( & ) is called" << std::endl;
|
||||||
|
o.use_object();
|
||||||
|
}
|
||||||
|
|
||||||
|
void h ( const copy_tracker& o )
|
||||||
|
{
|
||||||
|
std::cout << "h( const & ) is called" << std::endl;
|
||||||
|
o.use_object();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
*/
|
||||||
|
void s( const int & )
|
||||||
|
{
|
||||||
|
std::cout << "s( const int & ) is called" << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
void s( int && )
|
||||||
|
{
|
||||||
|
std::cout << "s( int && ) is called" << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
*/
|
||||||
|
|
||||||
|
void aaa( const std::string& s )
|
||||||
|
{
|
||||||
|
std::cout << s << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* rvalue and const_rvalue
|
||||||
|
*/
|
||||||
|
copy_tracker rvalue()
|
||||||
|
{
|
||||||
|
return copy_tracker();
|
||||||
|
}
|
||||||
|
|
||||||
|
const copy_tracker const_rvalue()
|
||||||
|
{
|
||||||
|
return copy_tracker();
|
||||||
|
}
|
||||||
|
|
||||||
|
int main( void )
|
||||||
|
{
|
||||||
|
copy_tracker lvalue;
|
||||||
|
const copy_tracker const_lvalue;
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
std::cout << "The following modifies an rvalue." << std::endl;
|
||||||
|
//
|
||||||
|
rvalue().non_const_method();
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
std::cout << "e is called for rvalue, const rvalue, lvalue, const lvalue." << std::endl;
|
||||||
|
//
|
||||||
|
e( rvalue() );
|
||||||
|
e( const_rvalue() );
|
||||||
|
e( lvalue );
|
||||||
|
e( const_lvalue );
|
||||||
|
//
|
||||||
|
// Const rvalue is handled by f( const & )
|
||||||
|
//
|
||||||
|
std::cout << "f is called for rvalue, const rvalue, lvalue, const lvalue." << std::endl;
|
||||||
|
//
|
||||||
|
f( rvalue() );
|
||||||
|
f( const_rvalue() );// f( const & )
|
||||||
|
f( lvalue );
|
||||||
|
f( const_lvalue );
|
||||||
|
//
|
||||||
|
// Rvalue is handled by g( const && )
|
||||||
|
//
|
||||||
|
std::cout << "g is called for rvalue, const rvalue, lvalue, const lvalue." << std::endl;
|
||||||
|
//
|
||||||
|
g( rvalue() );// g( const && )
|
||||||
|
g( const_rvalue() );
|
||||||
|
g( lvalue );
|
||||||
|
g( const_lvalue );
|
||||||
|
//
|
||||||
|
// Pre C++11 handling. h has only & and const & versions.
|
||||||
|
//
|
||||||
|
std::cout << "h is called for rvalue, const rvalue, lvalue, const lvalue." << std::endl;
|
||||||
|
//
|
||||||
|
h( rvalue() );// h(const &)
|
||||||
|
h( const_rvalue() );// h(const &)
|
||||||
|
h( lvalue );
|
||||||
|
h( const_lvalue );
|
||||||
|
//
|
||||||
|
// Try std::move
|
||||||
|
//
|
||||||
|
std::cout << "std::move." << std::endl;
|
||||||
|
//
|
||||||
|
e( std::move(rvalue()) );// e( && )
|
||||||
|
e( std::move(const_rvalue()) );// e ( const && )
|
||||||
|
e( std::move(lvalue) );// e( && )
|
||||||
|
e( std::move(const_lvalue) );// e ( const && )
|
||||||
|
#if 0
|
||||||
|
//
|
||||||
|
// The following converts lvalue and const lvalue to rvalue and const
|
||||||
|
// rvalue.
|
||||||
|
//
|
||||||
|
std::cout << "std::forward lvalue and const lvalue." << std::endl;
|
||||||
|
//
|
||||||
|
e( std::forward(rvalue()) );// e( && )
|
||||||
|
e( std::move(const_rvalue()) );// e ( const && )
|
||||||
|
e( std::forward(lvalue) );// e( && )
|
||||||
|
e( std::move(const_lvalue) );// e ( const && )
|
||||||
|
#endif
|
||||||
|
|
||||||
|
s( 5 );//s(int &&)
|
||||||
|
|
||||||
|
aaa( "aaaa");
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -1,68 +0,0 @@
|
|||||||
|
|
||||||
#include <iostream>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
class copy_tracker
|
|
||||||
{
|
|
||||||
int v;
|
|
||||||
public:
|
|
||||||
copy_tracker()
|
|
||||||
: v(0)
|
|
||||||
{
|
|
||||||
std::cout << "copy_tracker::copy_tracker()" << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
copy_tracker( const copy_tracker& c )
|
|
||||||
: v( c.v )
|
|
||||||
{
|
|
||||||
std::cout << "copy_tracker::copy_tracker( copy_tracker& c )" << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
void use_object() const
|
|
||||||
{
|
|
||||||
std::cout << v << std::endl;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
copy_tracker create_rvalue()
|
|
||||||
{
|
|
||||||
return copy_tracker();
|
|
||||||
}
|
|
||||||
|
|
||||||
const copy_tracker create_const_rvalue()
|
|
||||||
{
|
|
||||||
return copy_tracker();
|
|
||||||
}
|
|
||||||
|
|
||||||
void f ( copy_tracker&& o )
|
|
||||||
{
|
|
||||||
o.use_object();
|
|
||||||
}
|
|
||||||
|
|
||||||
void f_const ( const copy_tracker&& o )
|
|
||||||
{
|
|
||||||
o.use_object();
|
|
||||||
}
|
|
||||||
|
|
||||||
void aaa( const std::string& s )
|
|
||||||
{
|
|
||||||
std::cout << s << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
int main( void )
|
|
||||||
{
|
|
||||||
|
|
||||||
f( create_rvalue() );
|
|
||||||
|
|
||||||
f_const( create_rvalue() );
|
|
||||||
f_const( create_const_rvalue() );
|
|
||||||
|
|
||||||
copy_tracker lvalue;
|
|
||||||
f( std::move(lvalue) );
|
|
||||||
f_const( std::move(lvalue) );
|
|
||||||
|
|
||||||
aaa( "aaaa");
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
Reference in New Issue
Block a user