我使用Airplay SDK,这是一个为智能手机构建C ++应用程序的平台。它还具有使用MS Visual C ++ IDE +编译器的x86模拟器。

现在,我有这个课:

namespace Fair {

    class Bitmap : public Sprite {

    public:

        const CIw2DImage* const& getBitmapData() { return bitmapData; }; // warning: returning reference to temporary

    private:

        CIw2DImage* bitmapData;
    };

}


如果我使用GCC(ARM)调试进行构建,则会收到上述警告。我没有收到(x86)调试警告。

我在其他地方问过,得到了这个回复:


  因为`const CIw2DImage * const'是一个
  指向const CIw2DImage的const指针,以及
  Bitmap :: bitmapData是指向的指针
  非常量CIw2DImage编译器
  自动将指针转换为
  非const到const,所以这是一个
  临时。以下代码可能是
  由“典型”编译器生成:

const CIw2DImage* const& getBitmapData() {
    const CIw2DImage* const tmp = bitmapData;
    return tmp;
}

  
  可能是(x86)编译器未检测到
  这个问题。
  
  您可能要删除参考
  原型中的符号(&)(为什么
  您想在此使用参考
  案件?)


如果编译器这样做,那完全是错误的做法。使返回的值更“严格”只是在编译器级别,以防止“滥用”。 (x86)无法检测到,因为在第一种情况下它不会“引起”问题。

我返回对指针的引用是出于“节省” 32位内存的唯一原因,即使用与bitmapData指针相同的内存块,但使用的是不同的上下文。

有什么意见吗?

最佳答案

返回引用根本不会保存任何内存,它只是内部的一个指针。另外,const完全在编译时发生,没有理由要产生任何临时文件,即使是临时文件,也可以使用const引用它。

就我个人而言,该代码看起来很糟糕,但并非没有任何定义。

关于c++ - GCC ARM中的C++构建警告,而不是MS x86,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4978032/

10-14 18:37
查看更多