предупреждение: возврат ссылки на временный - PullRequest
24 голосов
/ 27 августа 2009

У меня есть такая функция

const string &SomeClass::Foo(int Value)
{
    if (Value < 0 or Value > 10)
        return "";
    else
        return SomeClass::StaticMember[i];
}

Я получаю warning: returning reference to temporary. Это почему? Я думал, что оба значения, которые возвращает функция (ссылка на const char * "" и ссылка на статический член), не могут быть временными.

Ответы [ 5 ]

48 голосов
/ 27 августа 2009

Это пример, когда происходит нежелательное неявное преобразование. "" не является std::string, поэтому компилятор пытается найти способ превратить его в единицу. И с помощью конструктора string( const char* str ) это успешно выполняется. Теперь был создан временный экземпляр std::string, который будет удален в конце вызова метода. Таким образом, очевидно, что не стоит ссылаться на экземпляр, который больше не будет существовать после вызова метода.

Я бы предложил вам изменить тип возвращаемого значения на const string или сохранить "" в элементе или статической переменной SomeClass.

6 голосов
/ 27 августа 2009

Это пример попытки оптимизировать код на с ++. Я сделал это, все сделали это ... Стоит отметить, что это классический пример, который имеет право на оптимизацию возвращаемого значения.

Как сказал ttvd, правильный ответ - вернуть const std :: string, а не ссылку на него, и позволить компилятору оптимизировать его.

Если вы доверяете переводчику вашего любимого языка для оптимизации позади вас, вы не должны пытаться быть слишком умным с C ++.

5 голосов
/ 27 августа 2009

Проблема в первой строке. "" будет преобразован в std::string, поскольку у него есть допустимый конструктор, который принимает char*. Это std::string будет анонимным объектом, который является временным, и вы вернете его ссылку.

4 голосов
/ 27 августа 2009

Как сказал Shaggy Frog, он преобразует "" во временный объект std :: string и, поскольку подпись вашего метода - std :: string, и он пытается вернуть ссылку на него, поэтому вы получаете предупреждение. Одним из обходных путей может быть возвращение std :: string по значению (const std :: string SomeClass :: Foo (..)).

0 голосов
/ 21 августа 2017

Другая возможность, которую можно избежать, - объявить то, что вы хотите вернуть, как статическое и просто использовать return по ссылке

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...