日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

【C++】动态内存管理/move/以及移动构造与移动赋值运算符

發(fā)布時間:2023/11/27 生活经验 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【C++】动态内存管理/move/以及移动构造与移动赋值运算符 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

      • 1 .對象移動與右值引用 實(shí)際應(yīng)用過程中遇到的問題及其解決方案
    • c++中臨時變量不能作為非const的引用參數(shù)
      • 2. 動態(tài)內(nèi)存管理類
      • 3. 對象移動與右值引用
      • 4. 移動構(gòu)造與移動復(fù)制運(yùn)算符

1 .對象移動與右值引用 實(shí)際應(yīng)用過程中遇到的問題及其解決方案

問題描述:

bool CrossCenters(const cv::Mat& image,
cv::Size& image_size);

/home/sun/orthodox_ws/deptrum/src/pipeline/orthodox_impl.cc:195:54: error: cannot bind non-const lvalue reference of type ‘cv::Size& {aka cv::Size_<int>&}’ to an rvalue of type ‘cv::Size {aka cv::Size_<int>}’ir_8bit.size(),~~~~~~~~~~~~^~

加上const

/home/sun/orthodox_ws/deptrum/orthodox/src/utils/loader.cc: In member function ‘bool deptrum::Loader::CrossCenters(const cv::Mat&, std::vector<cv::Mat>&, const Size&, std::vector<std::vector<cv::Point_<float> > >&, std::vector<std::vector<cv::Point3_<float> > >&, std::vector<deptrum::orthodox::CrossCenter>&, std::vector<cv::Mat>&, cv::Mat&, bool)’:
/home/sun/orthodox_ws/deptrum/orthodox/src/utils/loader.cc:70:27: error: passing ‘const Size {aka const cv::Size_<int>}’ as ‘this’ argument discards qualifiers [-fpermissive]image_size = image.size();

bool CrossCenters(const cv::Mat& image, cv::Size& image_size)在接口引用的過程中,如下

  result = CrossCenters(input_gray,input_gray.size())

內(nèi)部實(shí)現(xiàn):

bool CrossCenters(const cv::Mat& image,cv::Size& image_size) {
。。。。image_list.push_back(image);image_size = image.size();

分析:

通常情況下,函數(shù)f(a),a的值會存在一個臨時變量中,當(dāng)把這個臨時變量傳給f時候,由于 CrossCenters聲明中image_size參數(shù)是 cv::Size& ,不是常量引用。因?yàn)閏++編譯器的一個關(guān)于語義的限制,如果一個參數(shù)以非const引用傳入,c++編譯器就會認(rèn)為程序員會在函數(shù)中修改這個值,并且這個被修改的值在返回后要發(fā)揮作用。但是把一個臨時變量當(dāng)作非const引用參數(shù)傳進(jìn)來,由于臨時變量的特殊性,程序員并不能操作臨時變量,而且臨時變量隨時可能被釋放掉,所以一般來說,修改一個臨時變量是毫無意義的。據(jù)此,c++編譯器加入了臨時變量不能作為非const引用的這個語義限制。

c++中臨時變量不能作為非const的引用參數(shù)

解決方法參考:

https://www.cnblogs.com/area-h-p/p/11498481.html

2. 動態(tài)內(nèi)存管理類

3. 對象移動與右值引用

int a;
int b;a = 3;
b = 4;
a = b;
b = a;// 以下寫法不合法。
3 = a;
a+b = 4;

在 c 語言中, 確切地說應(yīng)該是左值表達(dá)式,右值表達(dá)式:表達(dá)式是有值的,值是有類型的,值是動態(tài)的,類型是靜態(tài)的,這是基本的概念 。通常來說有名字的變量就是左值(如上面例子中的 a, b),而由運(yùn)算操作(加減乘除,函數(shù)調(diào)用返回值等)所產(chǎn)生的中間結(jié)果(沒有名字)就是右值,如上的 3 + 4, a + b 等。我們暫且可以認(rèn)為:左值就是在程序中能夠?qū)ぶ档臇|西,右值就是沒法取到它的地址的東西(不完全準(zhǔn)確),但如上概念到了 c++ 中,就變得稍有不同。具體來說,在 c++ 中,每一個表達(dá)式都會產(chǎn)生一個左值,或者右值,相應(yīng)的,該表達(dá)式也就被稱作“左值表達(dá)式", “右值表達(dá)式”。對于基本數(shù)據(jù)類型來說(primitive types),左值右值的概念和 c 沒有太多不同,不同的地方在于自定義的類型,而且這種不同比較容易讓人混淆:

  1. 對于基礎(chǔ)類型,右值是不可被修改的(non-modifiable),也不可被 const, volatile 所修飾(cv-qualitification ignored)

  2. 對于自定義的類型(user-defined types),右值卻允許通過它的成員函數(shù)進(jìn)行修改。

對于 1),這和 c 是一致的,2) 卻是 C++ 中所獨(dú)有, 因此,如果你看到 C++ 中如下的寫法,千萬不要驚訝:

https://www.cnblogs.com/catch/p/5019402.html

https://www.cnblogs.com/catch/p/3500678.html

4. 移動構(gòu)造與移動復(fù)制運(yùn)算符

總結(jié)

以上是生活随笔為你收集整理的【C++】动态内存管理/move/以及移动构造与移动赋值运算符的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。