今天在利用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默認的編譯器)編譯時才報錯。在以後使用中需加以警惕。