国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

<五>move移動(dòng)語義和forward類型轉(zhuǎn)發(fā)

這篇具有很好參考價(jià)值的文章主要介紹了<五>move移動(dòng)語義和forward類型轉(zhuǎn)發(fā)。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

move : 移動(dòng)語義,得到右值類型
forward:類型轉(zhuǎn)發(fā),能夠識(shí)別左值和右值類型

只有兩種形式的引用,左值引用和右值引用,萬能引用不是一種引用類型,它存在于模板的引用折疊情況,但是能夠接受左值和右值
區(qū)分左值和右值得一個(gè)簡單方式就是能不能取地址
一個(gè)右值一旦有名字那么就變成了左值

#include <iostream>
using namespace std;

void process(int & i) {
	std::cout << i << " lvalue" << std::endl;
}

void process(int && i) {
	std::cout << i << " r value" << std::endl;
}

template<typename T>
void test(T && v) { //這里的&& 表示萬能引用,既能接受左值也能接受右值
	process(v);
}

int main() {

	int i = 100;
	test(i);
	test(200);

	system("pause");
	return 0;
}

<五>move移動(dòng)語義和forward類型轉(zhuǎn)發(fā)

上面的運(yùn)行結(jié)果 我們發(fā)現(xiàn) test(i); 和 test(200); 最后都調(diào)用了 void process(int & i) 左值形參,
test(T && v) 接受test(i)的時(shí)候,是用左值去接, 接受test(200)的時(shí)候,使用右值去接,
其中有一點(diǎn)右值本身是一個(gè)左值類型(如何理解?右值本身是有地址有名稱的,所以他本身就可以取地址了,他是一個(gè)左值)
所以函數(shù)形參一定是個(gè)左值,他有名字,有空間了,變成了具名對象,200傳過去后變成了一個(gè)左值.

200 傳入 test后就變成了一個(gè)左值了,進(jìn)入了test 函數(shù)后沒有保留好原始信息,所以 process(v); 就都調(diào)用了void process(int & i) 左值形參,
這個(gè)我叫做 不完美轉(zhuǎn)發(fā)

但是我希望 在test 函數(shù)內(nèi)任然能夠保留原始信息,原始的是左值繼續(xù)保留左值,原始是右值就繼續(xù)保留右值, 如何實(shí)現(xiàn)呢? 完美轉(zhuǎn)發(fā)

引用折疊技術(shù)

形參 是 T && v ,在模板函數(shù)形參,兩個(gè)引用 在一起會(huì)引發(fā)引用折疊, 有一個(gè)左值引用 最后是=》左值, 兩個(gè)都是右值 最后是=>右值

即 test(i) + void test(T && v) => T & && i => 左值
即 test(200) + void test(T && v) => T && && 200 => 右值

所以將 函數(shù)形參寫成 &&

//模板實(shí)例化過程中出現(xiàn)這種情況就會(huì)發(fā)生引用折疊,如果任一尹永偉左值引用,那么結(jié)果就是左值引用,
//如果兩個(gè)都是右值引用,那么結(jié)果為右值引用
template<typename T>
void test2(T && v) {	
	std::cout  <<"is int &  " <<  std::is_same_v<T, int &> << std::endl;
	std::cout << "is int    " <<  std::is_same_v<T, int > << std::endl;
}

int main() {

	int i = 100;
	test2(i);
	test2(200);

	system("pause");
	return 0;
}

<五>move移動(dòng)語義和forward類型轉(zhuǎn)發(fā)文章來源地址http://www.zghlxwxcb.cn/news/detail-433173.html

template<typename T>
void test2(T && v) {	
	std::cout  <<"is int &  "<< std::is_same_v<T, int &> << std::endl;
	std::cout << "is int    " << std::is_same_v<T, int > << std::endl;
}

int main() {

	int i = 100;
	test2(i);
	test2(200);

	system("pause");
	return 0;
}

test2(i) 調(diào)用模板會(huì)實(shí)例化出如下模板
void test2(int & && v) {	
	std::cout  <<"is int &  "<< std::is_same_v<T, int &> << std::endl;
	std::cout << "is int    " << std::is_same_v<T, int > << std::endl;
}

test2(200) 調(diào)用模板會(huì)實(shí)例化出如下模板
void test2(int && v) {	
	std::cout  <<"is int &  " << std::is_same_v<T, int &> << std::endl;
	std::cout << "is int    " << std::is_same_v<T, int > << std::endl;
}

上面兩個(gè)實(shí)例化出來的模板,形參根據(jù)引用折疊技術(shù) 
void test2(int & && v) =》void test2(int & v)
void test2(int &&   v) =》void test2(int && v)


即 如果 test2(i)  那么模板中的 T  就是  int &
如果 test2(200 )  那么模板中的 T  就是  int


所以 下面的代碼 
template<typename T>
void test(T && v) { //這里的&& 表示萬能引用,既能接受左值也能接受右值
	process(v);
}

我們這里這么改一下
template<typename T>
void test(T && v) { //這里的&& 表示萬能引用,既能接受左值也能接受右值      
	 
         process(static_cast<T&&>(v));
        // test(i)  => process( static_cast<int & &&>(v)); =>  process( static_cast<int & >(v));
        // test(200)=> process( static_cast<int &&>(v));   =>  process( static_cast<int && >(v));
}


到了這里,關(guān)于<五>move移動(dòng)語義和forward類型轉(zhuǎn)發(fā)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • c++右值引用、移動(dòng)語義、完美轉(zhuǎn)發(fā)

    左值:一般指的是在內(nèi)存中有對應(yīng)的存儲(chǔ)單元的值,最常見的就是程序中創(chuàng)建的變量 右值:和左值相反,一般指的是沒有對應(yīng)存儲(chǔ)單元的值(寄存器中的立即數(shù),中間結(jié)果等),例如一個(gè)常量,或者表達(dá)式計(jì)算的臨時(shí)變量 左值引用:C++中采用 對變量進(jìn)行引用,這種常規(guī)的引

    2024年02月05日
    瀏覽(18)
  • 【重學(xué)C++】05 | 說透右值引用、移動(dòng)語義、完美轉(zhuǎn)發(fā)(下)

    【重學(xué)C++】05 | 說透右值引用、移動(dòng)語義、完美轉(zhuǎn)發(fā)(下) 大家好,我是只講技術(shù)干貨的會(huì)玩code,今天是【重學(xué)C++】的第五講,在第四講《【重學(xué)C++】04 | 說透右值引用、移動(dòng)語義、完美轉(zhuǎn)發(fā)(上)》中,我們解釋了右值和右值引用的相關(guān)概念,并介紹了C++的移動(dòng)語義以及如

    2024年02月06日
    瀏覽(16)
  • 【重學(xué)C++】04 | 說透C++右值引用、移動(dòng)語義、完美轉(zhuǎn)發(fā)(上)

    【重學(xué)C++】04 | 說透C++右值引用、移動(dòng)語義、完美轉(zhuǎn)發(fā)(上) 大家好,我是只講技術(shù)干貨的會(huì)玩code,今天是【重學(xué)C++】的第四講,在前面《03 | 手?jǐn)]C++智能指針實(shí)戰(zhàn)教程》中,我們或多或少接觸了右值引用和移動(dòng)的一些用法。 右值引用是 C++11 標(biāo)準(zhǔn)中一個(gè)很重要的特性。第一

    2024年02月06日
    瀏覽(22)
  • Rust中的智能指針:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak<T>

    智能指針(smart pointers)是一類數(shù)據(jù)結(jié)構(gòu),是擁有數(shù)據(jù)所有權(quán)和額外功能的指針。是指針的進(jìn)一步發(fā)展 指針(pointer)是一個(gè)包含內(nèi)存地址的變量的通用概念。這個(gè)地址引用,或 ” 指向”(points at)一些其 他數(shù)據(jù) 。引用以 符號為標(biāo)志并借用了他們所 指向的值。除了引用數(shù)據(jù)

    2023年04月20日
    瀏覽(23)
  • C++ 中 <iterator> <functional> <numeric> 庫好用的函數(shù)

    簡述:迭代器省代碼用的。 std::advance 記憶方法:advance-前進(jìn)。 形如: advance(it, step) ,表示 it 迭代器自增 step 步。 實(shí)現(xiàn)類似于: 或 std::next std::prev 記憶方法:自己問英語老師。 形如 next(it, n) 及 prev(it, n) ,默認(rèn) n = 1 ,表示迭代器前移、后移 n 位。 為 std::advance 的變體,區(qū)

    2024年02月05日
    瀏覽(24)
  • C++學(xué)習(xí)筆記八:極限和數(shù)學(xué)運(yùn)算<limits><cmath>

    1) limits庫: 1.1 源文檔: https://en.cppreference.com/w/cpp/types/numeric_limits #include limits ? 1.2 庫函數(shù): 函數(shù)解釋: 對于一個(gè)浮點(diǎn)數(shù),lowest表示最小的可表示的負(fù)數(shù),min表示最小的可表示的接近0的數(shù),max表示最大的可表示的正數(shù) 對于一個(gè)有符號整數(shù),min表示可以表示的最小的負(fù)數(shù),

    2024年02月05日
    瀏覽(18)
  • 詳解dedecms后臺(tái)編輯器將回車<br>改為<p>的方法

    DEDECMS編輯器默認(rèn)回車[確認(rèn)鍵]是返回 這樣的。 有時(shí)候我們需要返回 這樣的,今天我們就講講后臺(tái)編輯器將回車將 改為 的有效教程吧。 方法也很簡單,首先我們找到dedecms后來臺(tái)編輯器的配置文件。 所在路徑為:/include/ckeditor/config.js 我們打開它,里面有兩個(gè)字: 替換為 這

    2024年02月02日
    瀏覽(24)
  • <html>

    在iOS開發(fā)中,經(jīng)常會(huì)涉及到支付功能,這里對常見的微信支付做一下詳細(xì)說明 微信開放平臺(tái)(微信支付須要付費(fèi)的。注冊成功后使用的主要為AppKey/SecretKey,當(dāng)中SecrectKey交由后臺(tái)完畢集成) 微信開放平臺(tái)是商戶APP接入微信支付開放接口的申請入口。通過此平臺(tái)可申請微信APP支付。

    2024年02月08日
    瀏覽(19)
  • class<T extends interface> 或 class<T extends abstract class>

    Java 泛型(generics)是 JDK 5 中引入的一個(gè)新特性, 泛型提供了編譯時(shí)類型安全檢測機(jī)制,該機(jī)制允許程序員在編譯時(shí)檢測到非法的類型。 類型通配符一般是使用 ? 代替具體的類型參數(shù) 要聲明一個(gè)有界的類型參數(shù),首先列出類型參數(shù)的名稱,后跟extends,最后緊跟它的上界

    2024年02月12日
    瀏覽(24)
  • 將較大的數(shù)組賦值<el-table></el-table>時(shí),會(huì)導(dǎo)致頁面卡頓,甚至崩潰

    遇到的問題:將長度為40的數(shù)組數(shù)據(jù)賦值el-table/el-table,我發(fā)現(xiàn)loading沒有效果,后面發(fā)現(xiàn)是頁面卡住了,loading直接沒有出現(xiàn)。 經(jīng)過查詢資料,發(fā)現(xiàn)el-table會(huì)有卡頓的問題,看到有的博主推薦使用一款叫umy-ui的插件,我就試了試,發(fā)現(xiàn)卡頓的問題解決了。 官網(wǎng): http://www.umyui

    2024年02月05日
    瀏覽(28)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包