Возврат ссылки в C++ [дубликат]

6
задан Peter Mortensen 24 June 2011 в 21:24
поделиться

3 ответа

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

Причина, по которой он здесь не сработал, вероятно, заключается в том, что вы не буквально возвращаете ссылку на локальную переменную, вы возвращаете переменную, которая является ссылкой на локальную переменную. Компилятор, вероятно, не обнаруживает эту несколько более сложную ситуацию. Он только обнаруживает такие вещи, как:

string &getString(){
    string str = "Devil Jin";
    return str;
}

Случай с двойником проще, потому что он не включает в себя создание и разрушение сложного объекта, поэтому в этой ситуации анализ управления потоком компилятора, вероятно, лучше справился с обнаружением ошибки.

16
ответ дан 8 December 2019 в 05:20
поделиться

У GCC раньше было расширение под названием Named Returns , которое позволяло делать то же самое, но выделяло пространство вне функции. К сожалению, этого больше не существует; Я не уверен, почему они взяли его

1
ответ дан 8 December 2019 в 05:20
поделиться

Ссылка на double относится к местоположению, которое все еще физически находится в памяти, но больше не в стеке. Вам это сойдет с рук только потому, что память еще не была перезаписана. В то время как double является примитивом, строка является объектом и имеет деструктор, который может очищать внутреннюю строку до нулевой длины, когда она выпадает из области видимости. Тот факт, что при вызове c_str () вы не получаете мусора, похоже, это подтверждает.

6
ответ дан 8 December 2019 в 05:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: