В в этой статье говорится, что следующий код действителен С++ 11 и работает с GNU libstdС++:
int n;
std::vector<int> v;
...
std::function<bool(int)> f(std::cref([n](int i) {return i%n == 0));
std::count_if(v.begin(), v.end(), f);
Дело в том, что я полагал, что объект лямбда будет создан на сайте вызова, что сделает его временным объектом в этом фрагменте, поскольку он не хранится ни на одной переменной, а вместо этого ссылается на const
создается и передается в std::function
. Если это так, то лямбда-объект должен был быть уничтожен справа, оставив оборванную ссылку внутри f
, что приведет к поведению undefined при использовании std::count_if
.
Предполагая, что статья не ошибается, что не так в моей ментальной модели? Когда объект лямбда разрушен?