2017年3月21日 星期二

引入參數如何區分左值與右值

引入參數如何區分左值與右值

tags: C++ Concept

右值大原則

  • 大原則他 沒有名字
  • 只能放置在等號右邊,不能夠放置在等號左邊(不能賦值)
int val(){
    return 0;
}
int i=0;   // 名字是i
val();     // 名字?
val()=0;   // Error

主程式引入處

一般而言如果直接定義,那麼他將是個右值
fun(1);
如果是一個已經被定義的變數,已經具有名字可以使用move()轉為右值
int i = 1;
fun(std::move(i));

副程式引入參數

只有左值
void fun(int & i){
    cout << "l only" << endl;
}
只有右值
void fun(int const && i){
    cout << "r only" << endl;
}
左右值通吃(低優先權)
void fun2(int const & i){
    cout << "l or r" << endl;
}

副程式返回參數

因為返回的參數都是沒有名字的,所以都會是右值
int val(){
    return 0;
}
int i = val();
val() = 1; // Error

範例代碼

/*****************************************************************
Name : 
Date : 2017/03/20
By   : CharlotteHonG
Final: 2017/03/20
*****************************************************************/
#include <iostream>
using namespace std;

void fun(int & i){
    cout << "l only" << endl;
}
void fun(int const && i){
    cout << "r only" << endl;
}

void fun2(int const & i){
    // 如果有其他限定左右直的函式則他們優先
    cout << "l or r" << endl;
}

int val(){
    return 0;
}
/*==============================================================*/
int main(int argc, char const *argv[]){
    int i(0);
    // fun1
    fun(i);
    fun(move(i));
    fun(val());
    // fun2
    fun2(i);
    fun2(move(i));
    fun2(val());

    return 0;
}
/*==============================================================*/

1 則留言: