Невозможно напрямую получить адрес лямбда-объекта внутри лямбды.
Теперь, как это бывает, это довольно часто полезно. Наиболее распространенное использование - для рекурсии.
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 комбинатору (он же комбинатор с фиксированной точкой), как я полагаю. То, что вы хотите, зависит от того, что вы подразумеваете под «адресом лямбды».