Нет способа захватить объект по значению и иметь значение const
. Грамматика для init-capture
равна
init-capture:
identifier initializer
& identifier initializer
, где identifier
равна
identifier:
identifier-nondigit
identifier identifier-nondigit
identifier digit
Это означает, что вы можете указать только имя, без каких-либо cv-квалификаторов. Для не изменяемой лямбды это не проблема, поскольку функция будет const
, и вы не сможете изменить захват по значению объекта.
Для изменяемой лямбды вы можете захватить ссылку на const, подобную вам. делать с [&widget = std::as_const(widget)]
. Если вы не можете или не хотите иметь ссылку, вам нужно написать const-оболочку, такую как
template <typename T>
class const_wrapper
{
const T obj;
public:
const_wrapper(T obj) : obj(obj) {}
operator const T&() const { return obj; }
};
Вышеуказанный объект является копируемым, но не назначаемым (из-за члена const) и только разрешает постоянный доступ к базовому типу.