#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
      
      
}
arrow
arrow
    全站熱搜

    hedgezzz 發表在 痞客邦 留言(0) 人氣()