#include <iostream> #include <memory> #include <string> using namespace std ; using X = std::string ; X foobar() { X xtmp ; return xtmp ; } void foo(X &x) { cout << "foo para lvalue" << endl ; } void foo(X &&x) { cout << "foo para rvalue" << endl ; } void foo2( const X&x) { cout << "foo2 called, lvalue or rvalue unknown " << endl ; } void DoLRvalue( const string& s ) { cout << "DoLRvalue lvalue used " << endl ; } void DoLRvalue(string&& s ) { cout << "DoLRvalue rvalue used" << endl ; } template < typename Arg> void foo3(Arg &&arg) { DoLRvalue(std::forward<Arg>(arg)); } void foo4(X &&x) { DoLRvalue(x) ; } void foo5(X &&x) { DoLRvalue(std::forward<string>(x)) ; } int main () { X x ; foo(x) ; //lvalue foo(foobar()) ; //rvalue cout << "===========================" << endl ; X x2 ; foo2(x2) ; //"foo2 called, lvalue or rvalue unknown " foo2(foobar()) ; //"foo2 called, lvalue or rvalue unknown " cout << "===========================" << endl ; X x3 ; foo3(x3) ; //DoLRvalue lvalue used foo3(foobar()) ; //DoLRvalue rvalue used cout << "===========================" << endl ; X x4 ; //foo4(x4) ; //compile error foo4(foobar()) ; //DoLRvalue lvalue used cout << "===========================" << endl ; X x5 ; //foo5(x5) ; //compile error foo5(foobar()) ; //DoLRvalue rvalue used } |
全站熱搜
留言列表