關於C++中的常量引用和常量成員函數

今天在利用NDKr13b將VS2013工程移植到Android平臺過程中遇到了關於兩個關於如題的小問題,在此做一記錄。

1.問題描述:定義了一個結構體structA(在結構體中定義了構造函數,形如structA(int m){})和一個以此結構體作爲入參的函數fun(structA & m_A),在VS工程中多次存在形如

fun(structA(0))的調用,在NDK編譯時編譯器報錯:非常量引用無法綁定臨時變量。

簡化如下:int a = 1;

                         int &b = a;//OK

                         int &b = 1;//not OK

                          const int &b = 1;//OK

     解決方法:將fun的入參改爲fun(const structA & m_A)。

2.問題描述:定義了一個結構體structB(在結構體中定義了一個成員函數funA())和一個以此結構體作爲入參的函數funB(const structB & m_B),在funB中存在m_B.funA()的調用,在NDK編譯時出錯:m_B的this指針爲const,而funA()是非const函數,不可用。

      基本原理:常量結構體無法調用非常量成員函數(不然就有可能通過非常量成員函數修改結構體,不符合const的機制)。

     解決方法:將funA()聲明改爲funA const (),即將其改爲常量成員函數。

小結:這兩個問題可以歸結爲const限定符問題,由於VS編譯器並沒有對其進行報警(原理還未深究),因此直到用clang(NDKr13e默認的編譯器)編譯時才報錯。在以後使用中需加以警惕。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章