スマートフォン用のC++アプリを構築するためのプラットフォームであるAirplaySDKを使用しています。また、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'はconstCIw2DImageへのconstポインターであり、Bitmap::bitmapDataは非constへのポインターであるためCIw2DImageコンパイラーは自動的にnon-constへのポインターをconstにキャストします。次のコードは、「一般的な」コンパイラによって生成される可能性があります。
const CIw2DImage* const& getBitmapData() { const CIw2DImage* const tmp = bitmapData; return tmp; }おそらく(x86)コンパイラはこの問題を検出しません。
プロトタイプから参照記号(&)を削除することをお勧めします(この場合、なぜ参照を使用するのですか?)
コンパイラがそれを行う場合、それは完全に間違った慣行です..?返される値をより「厳密」にすることは、「乱用」を防ぐために、単にコンパイラレベルで行われます。(x86)最初のケースでは問題を「引き起こさない」ため、検出されません。
32ビットのメモリを「節約」するという唯一の理由でポインタへの参照を返します。つまり、bitmapDataポインタと同じメモリブロックを使用しますが、コンテキストは異なります。
コメントをお願いします。