簡體   English   中英

C ++在GCC ARM中構建警告,但不在MS x86中構建警告

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM