【C++】动态内存管理/move/以及移动构造与移动赋值运算符
文章目錄
- 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 沒有太多不同,不同的地方在于自定義的類型,而且這種不同比較容易讓人混淆:
-
對于基礎(chǔ)類型,右值是不可被修改的(non-modifiable),也不可被 const, volatile 所修飾(cv-qualitification ignored)
-
對于自定義的類型(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小米多少钱一斤啊?
- 下一篇: 【SLAM后端】—— ceres优化相机