У меня есть ситуация, когда у меня есть член, возвращающий const&
, и затем этот результат пересылается в лямбду, которая имеет тот же тип возврата.
MSVC2017 идентифицирует эту ситуацию как рискованную и выдает предупреждение: returning address of local variable or temporary
. Эмпирическое тестирование с использованием clang и других компиляторов показывает, что это действительно так. Я не понимаю, почему это отличается от нескольких вызовов методов, которые возвращают один и тот же тип.
Например, это прекрасно работает:
class A {
public:
const std::string& name() const { return m_name; }
private:
std::string m_name;
};
class B {
public:
const std::string& name() const { return m_a.name(); }
private:
A m_a;
};
//...
B b;
std::cout << b.name();
Работает, как и ожидалось, без предупреждений / ошибок при компиляции или во время выполнения.
Но с лямбдой это не так:
class A {
public:
const std::string& name() const { return m_name; }
private:
std::string m_name;
};
//...
using Getter = std::function< const std::string&() >;
A a;
Getter g = [&a] { return a.name(); };
std::cout << g();
приводит к сбою или, по крайней мере, печати поврежденной памяти
Может кто-нибудь указать мне информацию о том, почему это не работает? Как правило, я ожидаю, что он будет работать так же ...