Невозможно напрямую получить адрес лямбда-объекта внутри лямбды.
Теперь, как это бывает, это довольно часто полезно. Наиболее распространенное использование для того, чтобы рекурсировать.
y_combinator
Приходит из языков , где вы никогда не могли говорить о себе , пока вы где определены. Это может быть реализовано довольно легко в C ++ :
template<class F>
struct y_combinator {
F f;
template<class...Args>
decltype(auto) operator()(Args&&...args) const {
return f( f, std::forward<Args>(args)... );
}
template<class...Args>
decltype(auto) operator()(Args&&...args) {
return f( f, std::forward<Args>(args)... );
}
};
Теперь вы можете сделать это:
y_combinator{ [](auto& self) {
std::cout<<"Address of this lambda function is => "<< &self;
} }();
Варианты этого могут включать в себя:
template<class F>
struct y_combinator {
F f;
template<class...Args>
decltype(auto) operator()(Args&&...args) const {
return f( *this, std::forward<Args>(args)... );
}
template<class...Args>
decltype(auto) operator()(Args&&...args) {
return f( *this, std::forward<Args>(args)... );
}
};
где self
переданный может быть вызван без передачи в self
качестве первого аргумента.
Второе соответствует настоящему y комбинатору (он же комбинатор с фиксированной точкой), я считаю. То, что вы хотите, зависит от того, что вы подразумеваете под «адресом лямбды».