Вы никогда не должны возвращать ссылку на локальную переменную, независимо от того, что компилятор делает или не делает. Компилятор легко обмануть.вы не должны основывать правильность своего кода на каком-то предупреждении, которое могло не сработать.
Причина, по которой он здесь не сработал, вероятно, заключается в том, что вы не буквально возвращаете ссылку на локальную переменную, вы возвращаете переменную, которая является ссылкой на локальную переменную. Компилятор, вероятно, не обнаруживает эту несколько более сложную ситуацию. Он только обнаруживает такие вещи, как:
string &getString(){
string str = "Devil Jin";
return str;
}
Случай с двойником проще, потому что он не включает в себя создание и разрушение сложного объекта, поэтому в этой ситуации анализ управления потоком компилятора, вероятно, лучше справился с обнаружением ошибки.
У GCC раньше было расширение под названием Named Returns , которое позволяло делать то же самое, но выделяло пространство вне функции. К сожалению, этого больше не существует; Я не уверен, почему они взяли его
Ссылка на double
относится к местоположению, которое все еще физически находится в памяти, но больше не в стеке. Вам это сойдет с рук только потому, что память еще не была перезаписана. В то время как double
является примитивом, строка
является объектом и имеет деструктор, который может очищать внутреннюю строку до нулевой длины, когда она выпадает из области видимости. Тот факт, что при вызове c_str ()
вы не получаете мусора, похоже, это подтверждает.