[英]C++ Build warning in GCC ARM but not MS x86
我使用Airplay SDK,這是一個為智能手機構建C ++應用程序的平台。 它還有一個x86模擬器,它使用MS Visual C ++ IDE +編譯器。
現在,我有這個班:
namespace Fair {
class Bitmap : public Sprite {
public:
const CIw2DImage* const& getBitmapData() { return bitmapData; }; // warning: returning reference to temporary
private:
CIw2DImage* bitmapData;
};
}
如果我使用GCC(ARM)Debug構建,我會收到上述警告。 我沒有得到(x86)Debug的警告。
我問其他地方,我收到了這個回復:
因為`const CIw2DImage * const'是一個指向const CIw2DImage的const指針,而Bitmap :: bitmapData是一個指向非const的指針CIw2DImage編譯器會自動將指向非const的指針轉換為const,所以這里是臨時的。 以下代碼可能是由“典型”編譯器生成的:
const CIw2DImage* const& getBitmapData() { const CIw2DImage* const tmp = bitmapData; return tmp; }
可能(x86)編譯器沒有檢測到這個問題。
您可能希望從原型中刪除引用符號(&)(在這種情況下,為什么要使用引用?)
如果編譯器這樣做,那么這是完全錯誤的做法..? 使返回的值更“嚴格”只是在編譯器級別,以防止“濫用”。 (x86)沒有檢測到,因為它沒有“引起”第一種情況下的問題..?
我返回對指針的引用,其唯一原因是“保存”32位內存,即使用與bitmapData指針相同的內存塊但在不同的上下文中。
有什么意見嗎?
編譯器這樣做是非常正確的。 引用必須引用正確類型的對象; 這里有一個CIw2DImage*
類型的對象,你需要一個不同類型的引用, const CIw2DImage*
。 執行此操作的唯一方法是創建一個正確類型的臨時(這可以在這里,因為const T*
可以隱式轉換為T*
),並返回對它的引用。
不幸的是,這導致對函數范圍內的臨時對象的引用,一旦函數返回,該對象將不再有效。
最簡單的解決方案是按值返回指針; 這將更有效(因為它避免了不必要的間接級別),以及避免這個問題。
你不會保存所有返回引用的內存,它只是一個內部指針。 另外,const在編譯時完全發生,沒有任何臨時生成的原因 - 即使它是,對它的const引用也是有效的。
就我個人而言,該代碼看起來很糟糕,但並非沒有任何定義。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.