C ++ Предупреждение о сборке в GCC ARM, но не в MS x86 - PullRequest
0 голосов
/ 12 февраля 2011

Я использую 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 на constCIw2DImage и Bitmap :: bitmapData - указатель на неконстантный компилятор CIw2DImage автоматически переводит указатель на неконстантный в константный, так что здесь временный.Следующий код может быть сгенерирован «типичным» компилятором:

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

Возможно, (x86) компилятор не обнаружит эту проблему.

Возможно, вы захотите удалить символ ссылки (&)из прототипа (почему вы хотите использовать ссылку в этом случае?)

Если компилятор делает это, то это абсолютно неправильная практика ..?Сделать возвращаемое значение более «строгим» просто на уровне компилятора, чтобы предотвратить «злоупотребление».(x86) не обнаруживает, потому что это не «вызывает» проблему в 1-м случае ..?

Я возвращаю ссылку на указатель по единственной причине, чтобы «сохранить» 32 бита памяти,то есть использовать тот же блок памяти, что и указатель bitmapData, но в другом контексте.

Любые комментарии, пожалуйста?

Ответы [ 2 ]

2 голосов
/ 12 февраля 2011

Компилятор вполне корректен для этого. Ссылка должна ссылаться на объект правильного типа; здесь у вас есть объект типа CIw2DImage*, и вам нужна ссылка на другой тип, const CIw2DImage*. Единственный способ сделать это - создать временный файл правильного типа (что здесь возможно, поскольку const T* можно неявно преобразовать в T*) и вернуть ссылку на него.

К сожалению, это приводит к ссылке на временный объект в области действия функции, который больше не действителен после возврата из функции.

Самое простое решение - вернуть указатель по значению; это будет более эффективным (так как позволит избежать ненужного уровня косвенности), а также позволит избежать этой проблемы.

0 голосов
/ 12 февраля 2011

Вы вообще не будете экономить память, возвращая ссылку, это просто указатель внутри. Кроме того, const происходит полностью во время компиляции, нет никаких причин для создания какого-либо временного файла - и даже если бы это было так, ссылка на const была бы допустимой.

Этот код лично мне кажется ужасным, но он никак не определен.

...