Захват глобальных переменных лямбдой

111
28 апреля 2019, 16:40

Как правильно захватывать глобальные переменные в лямбде? Хочу использовать следующим образом, но выдаются предупреждения. Как их подавить?

#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
int offset = 1;
int scale = 2;

int main() {
    auto shift = [&offset, scale](int b) { return (offset + b) * scale; };
    std::vector values = {1, 2, 3, 4, 5};
    std::transform(values.cbegin(), values.cend(), std::ostream_iterator<int>{std::cout}, shift);
}
Answer 1

Глобальные переменные, как и статические, нет необходимости (и не разрешается) захватывать. Их можно использовать в лямбдах без захвата.

Если очень хочется иметь в лямбде копию переменной (например если лямбда - mutable, и эту копию хочется изменять), то можно использовать захват с инициализацией:
[offset_copy = offset, scale_copy = scale](int b) /*...*/.

READ ALSO
Включить все заголовочные файлы

Включить все заголовочные файлы

Можно ли как-то включить в maincpp все возможные заголовочные файлы языка, чтобы каждый раз не думать, что подключать? Может есть специальный...

164
Чем отличаются функции move и forward?

Чем отличаются функции move и forward?

С функцией move вроде бы всё понятно: она приводит любую ссылку на объект к неконстантной rvalue-ссылке, которая в соответствующем контексте передастся...

138
Удаление елементов из QListWidget

Удаление елементов из QListWidget

Доброго времени суток

128
Техника pimpl c++

Техника pimpl c++

Что такое техника pimpl и когда нужно её использовать?

146