В дополнение к ответам 1, 2, 3 и , предположим следующие методыВозвращение константную ссылку на локальную переменную правильно
QString createString()
{
return QString("foobar");
}
const QString& getString()
{
return createString();
}
Это даст знаменитый «предупреждение C4172: обратный адрес локальной переменной или временный» с VS2013.
Теперь, если я изменил второй метод
const QString& getString()
{
const QString& binder = createString();
return binder;
}
Который не сообщает об ошибке больше. Это безопасный способ исправить предупреждение без изменения подписи API? Почему это работает?
Почему бы не создать 'createString()' просто вернуть указатель из 'new QString'? Затем вызывающая сторона владеет строкой и может сохранять, удалять или ссылаться на нее по мере необходимости. – donjuedo
@donjuedo Это ужасная идея. Нет никаких указателей, и ручное управление памятью в такой ситуации совершенно необоснованно. – pmr
@pmr, со всем уважением, я не согласен. Создание объекта, но без имени переменной или указателя, оставляет неудобную ситуацию, когда пришло время использовать новый объект. – donjuedo