我使用 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) 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 指针相同的内存块,但在不同的上下文中。
请问有什么意见吗?