Меня только что укусило неприятное поведение undefined из-за возврата ссылки на локальный переменная.
Мы знаем, что это зло, и обычно компилятор выводит красивое предупреждение
, чтобы сообщить нам, что ... ну, gcc (3.4.2), похоже, не слишком далеко заходит в проверки.
std::string get_env_value(std::string const& key);
std::string const& get_phase()
{
std::string const& phase = get_env_value("PHASE"); // [1]
std::cout << "get_phase - " << phase << '\n';
return phase; // [2]
}
Это компилируется без сбоев, и все же мы попадаем в неприятную область неопределенного поведения.
Строка [1]
в порядке, потому что стандарт определяет, что время жизни переменной, привязанной к константной ссылке, должно быть увеличено, чтобы соответствовать времени жизни константной ссылки.
Строка [2]
тоже кажется приемлемой ...
Мне кажется, что статический анализ должен показать, что использование «продления срока службы» для [1]
, [2]
небезопасно, но может быстро стать уродливым ...