引入參數如何區分左值與右值
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;
}
/*==============================================================*/
The explanation for lvalue & rvalue is clear!
回覆刪除