From 7f4654eec4c7d6eb543f4b3aa841ea35539cd974 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Fri, 17 Apr 2026 08:25:30 -0500 Subject: [PATCH] [core] Fix DelayAction compile error with non-const reference args The lambda in DelayAction::play_complex must be `mutable` so captured copies of non-const reference arguments (e.g. std::string& from the http_request on_response trigger) can bind to the non-const reference parameters of play_next_(const Ts&...). Without `mutable`, the captured members are const-qualified and cannot bind to `T&`. Regression from #14968 which replaced std::bind with a lambda. Fixes https://github.com/esphome/esphome/issues/15808 --- esphome/core/base_automation.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/esphome/core/base_automation.h b/esphome/core/base_automation.h index 11133d3973..17f937d10d 100644 --- a/esphome/core/base_automation.h +++ b/esphome/core/base_automation.h @@ -205,7 +205,9 @@ template class DelayAction : public Action, public Compon } else { // For delays with arguments, capture by value to preserve argument values // Arguments must be copied because original references may be invalid after delay - auto f = [this, x...]() { this->play_next_(x...); }; + // `mutable` is required so captured copies of non-const reference args (e.g. std::string&) + // are passed as non-const lvalues to play_next_(const Ts&...) where Ts may be `T&` + auto f = [this, x...]() mutable { this->play_next_(x...); }; App.scheduler.set_timer_common_(this, Scheduler::SchedulerItem::TIMEOUT, Scheduler::NameType::NUMERIC_ID_INTERNAL, nullptr, static_cast(InternalSchedulerID::DELAY_ACTION), this->delay_.value(x...), std::move(f),