Почему я все еще могу получить доступ к ссылке на временный объект?

const std::string& f(){
    std::string s = "Hello";
    return s + s;
}
int main() {
    std::string s = "Hello";
    std::string& s1 = s + s;
    s1 += "!";
    std::cout << f();
}

У меня есть несколько вопросов об этом коде, который я написал.

Почему я все еще могу получить доступ к s1 и изменить его, даже если это неконстантная ссылка на временный объект?

Почему f выдает ошибку времени выполнения? Я думал, что const продлит время жизни временного объекта?


person Maik Klein    schedule 12.08.2014    source источник
comment
Продление срока службы происходит только в том случае, если временный объект привязан к именованной константной ссылке; возвращаемый тип не считается.   -  person M.M    schedule 12.08.2014
comment
Нет ошибки времени выполнения из f(), потому что вы никогда не вызываете функцию   -  person M.M    schedule 12.08.2014


Ответы (1)


Вы случайно не используете Visual Studio? Это позволяет вашему коду, использующему s1, работать как расширение языка. Я считаю, что часть кода безопасна (не обращая внимания на то, является ли это хорошей практикой).

Только константная ссылочная локальная переменная может продлить время жизни временной. Но никогда не разрешается возвращать локальную переменную по ссылке (если только она не является статической). Поэтому ваша функция f недействительна.

person Neil Kirk    schedule 12.08.2014