Здравствуйте, Shmj, Вы писали:
S>Здравствуйте, Homunculus, Вы писали:
H>>Аргумент делегата
S>Делегата? А что в C++ их добавили? Или имеешь в виду ссылка на функцию?
А тебя тело функции внутри круглых скобок не смутило?
Здравствуйте, Shmj, Вы писали:
S>Кто может ткнуть носом, что значит [socket] — что за конструкция?
Захват переменной по значению, которую можно использовать в коде лямбды (замыкания).
Еще варианты:
[] — ничего не захватываем
[=] — захватываем все локальные переменные по значению
[&] — захватываем все локальные переменные по адресу
Здравствуйте, Marty, Вы писали:
M>Здравствуйте, pilgrim_, Вы писали:
_>>[&] — захватываем все локальные переменные по адресу
M>Только по ссылке. Ну, и после общего указания, можно ещё через запятую захват конкретных переменных сделать
С тем учтонением, что если "общее указание" — захват по ссылке, то конкретные перемнные можно указать только для захвата по значению. И наоборот.
Почему было введено такое ограничение — навскидку не скажу.
Здравствуйте, andrey.desman, Вы писали:
AD>Здравствуйте, pilgrim_, Вы писали:
_>>[=] — захватываем все локальные переменные по значению _>>[&] — захватываем все локальные переменные по адресу
AD> Тут важно уточнить, что не все, а все используемые.
Здравствуйте, Marty, Вы писали:
M>Все видимые в точке захвата, не?
Не. Все используемые.
M>Что значит — используемые?
Которые используются в теле лямбды.
Здравствуйте, andrey.desman, Вы писали:
M>>Все видимые в точке захвата, не? AD>Не. Все используемые.
M>>Что значит — используемые? AD>Которые используются в теле лямбды.
Здравствуйте, Pzz, Вы писали:
Pzz>Это анонимная функция (функция есть, а имени у нее нету), описанная прям по месту использования. В нонешнем C++ и не такое бывает.
Не функция, а функтор. Класс с перегруженным оператором ().
А код ТСа в ++03 был бы записан примерно так:
struct Anon {
Socket socket;
Anon(Socket socket): socket(socket) {}
void operator()(std::vector<unsigned char> data) {
auto task = Async(process1, data); // ну тут не auto понятно
process(data);
task.wait();
socket.send(data, kNoCallback);
}
}
...
socket.receive(Anon(socket));
И он на самом деле именно это и означает, просто такой вот сахарок.
Кстати ++03 ещё и не давал структуры с методами имплементировать внутри тела функции, требовал вытаскивать кишки наружу.
Я к тому, чтоб ТС оценил удобство.
Здравствуйте, T4r4sB, Вы писали:
Pzz>>Это анонимная функция (функция есть, а имени у нее нету), описанная прям по месту использования. В нонешнем C++ и не такое бывает.
TB>Не функция, а функтор. Класс с перегруженным оператором ().
Ну я понимаю, что в сишном рантайме настоящую функцию на ходу не создашь. Но логически это именно функция.
Здравствуйте, Marty, Вы писали:
M>Здравствуйте, Андрей Тарасевич, Вы писали:
АТ>>С тем учтонением, что если "общее указание" — захват по ссылке, то конкретные перемнные можно указать только для захвата по значению. И наоборот.
M>Разве?
Именно так.
[&, i] — допустимо. Общий захват — по ссылке, i — по значению.
[&, &i] — ошибка. Нельзя захватывать i по ссылке, если общий захват и так по ссылке.
[=, i] — ошибка. Нельзя захватывать i по значению, если общий захват и так по значению.
[=, &i] — допустимо. Общий захват — по значению, i — по ссылке.