Не распарсил конструкцию с []
От: Shmj Ниоткуда  
Дата: 27.01.22 16:17
Оценка: -2 :))) :))) :)))
Кто может ткнуть носом, что значит [socket] — что за конструкция?

socket.receive([socket](std::vector<unsigned char> data) {
  auto task = Async(process1, data);
  process(data);
  task.wait();

  socket.send(data, kNoCallback);
});
Re: Не распарсил конструкцию с []
От: Homunculus Россия  
Дата: 27.01.22 16:19
Оценка: 3 (1) -3
Здравствуйте, Shmj, Вы писали:

Аргумент делегата
Re[2]: Не распарсил конструкцию с []
От: Shmj Ниоткуда  
Дата: 27.01.22 16:20
Оценка:
Здравствуйте, Homunculus, Вы писали:

H>Аргумент делегата


Делегата? А что в C++ их добавили? Или имеешь в виду ссылка на функцию?
Re[3]: Не распарсил конструкцию с []
От: Homunculus Россия  
Дата: 27.01.22 16:21
Оценка: :))
Здравствуйте, Shmj, Вы писали:

S>Здравствуйте, Homunculus, Вы писали:


H>>Аргумент делегата


S>Делегата? А что в C++ их добавили? Или имеешь в виду ссылка на функцию?


А тебя тело функции внутри круглых скобок не смутило?
Re: Не распарсил конструкцию с []
От: reversecode google
Дата: 27.01.22 16:23
Оценка:
не надо сразу читать полухина
С++ учить надо с основ
Re[3]: Не распарсил конструкцию с []
От: Alexander G Украина  
Дата: 27.01.22 16:23
Оценка: 3 (1) +1
Здравствуйте, Shmj, Вы писали:

S>Делегата? А что в C++ их добавили?


Lambda expressions (since C++11)
Русский военный корабль идёт ко дну!
Re: Не распарсил конструкцию с []
От: pilgrim_ Россия  
Дата: 27.01.22 16:25
Оценка: +1
Здравствуйте, Shmj, Вы писали:

S>Кто может ткнуть носом, что значит [socket] — что за конструкция?


Захват переменной по значению, которую можно использовать в коде лямбды (замыкания).
Еще варианты:
[] — ничего не захватываем
[=] — захватываем все локальные переменные по значению
[&] — захватываем все локальные переменные по адресу

https://docs.microsoft.com/en-us/cpp/cpp/lambda-expressions-in-cpp?view=msvc-170
Отредактировано 27.01.2022 16:26 pilgrim_ . Предыдущая версия .
Re[2]: Не распарсил конструкцию с []
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 27.01.22 16:38
Оценка: +3
Здравствуйте, pilgrim_, Вы писали:

_>[&] — захватываем все локальные переменные по адресу


Только по ссылке. Ну, и после общего указания, можно ещё через запятую захват конкретных переменных сделать
Маньяк Робокряк колесит по городу
Re[2]: Не распарсил конструкцию с []
От: andrey.desman Россия  
Дата: 28.01.22 23:42
Оценка: +1
Здравствуйте, pilgrim_, Вы писали:

_>[=] — захватываем все локальные переменные по значению

_>[&] — захватываем все локальные переменные по адресу

Тут важно уточнить, что не все, а все используемые.
Re[3]: Не распарсил конструкцию с []
От: Андрей Тарасевич Беларусь  
Дата: 29.01.22 06:34
Оценка:
Здравствуйте, Marty, Вы писали:

M>Здравствуйте, pilgrim_, Вы писали:


_>>[&] — захватываем все локальные переменные по адресу


M>Только по ссылке. Ну, и после общего указания, можно ещё через запятую захват конкретных переменных сделать


С тем учтонением, что если "общее указание" — захват по ссылке, то конкретные перемнные можно указать только для захвата по значению. И наоборот.

Почему было введено такое ограничение — навскидку не скажу.
Best regards,
Андрей Тарасевич
http://files.rsdn.org/2174/val.gif
Отредактировано 29.01.2022 6:38 Андрей Тарасевич . Предыдущая версия .
Re[4]: Не распарсил конструкцию с []
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 29.01.22 07:57
Оценка:
Здравствуйте, Андрей Тарасевич, Вы писали:


АТ>С тем учтонением, что если "общее указание" — захват по ссылке, то конкретные перемнные можно указать только для захвата по значению. И наоборот.


Разве?
Маньяк Робокряк колесит по городу
Re[3]: Не распарсил конструкцию с []
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 29.01.22 07:58
Оценка:
Здравствуйте, andrey.desman, Вы писали:

AD>Здравствуйте, pilgrim_, Вы писали:


_>>[=] — захватываем все локальные переменные по значению

_>>[&] — захватываем все локальные переменные по адресу

AD> Тут важно уточнить, что не все, а все используемые.


Все видимые в точке захвата, не?

Что значит — используемые?
Маньяк Робокряк колесит по городу
Re[4]: Не распарсил конструкцию с []
От: andrey.desman Россия  
Дата: 29.01.22 08:03
Оценка:
Здравствуйте, Marty, Вы писали:

M>Все видимые в точке захвата, не?

Не. Все используемые.

M>Что значит — используемые?

Которые используются в теле лямбды.
Re[5]: Не распарсил конструкцию с []
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 29.01.22 08:17
Оценка: -1
Здравствуйте, andrey.desman, Вы писали:

M>>Все видимые в точке захвата, не?

AD>Не. Все используемые.

M>>Что значит — используемые?

AD>Которые используются в теле лямбды.

Это уже оптимизация
Маньяк Робокряк колесит по городу
Re[6]: Не распарсил конструкцию с []
От: andrey.desman Россия  
Дата: 29.01.22 08:22
Оценка: +3
Здравствуйте, Marty, Вы писали:

AD>>Которые используются в теле лямбды.

M>Это уже оптимизация

Это стандарт!
Re: Не распарсил конструкцию с []
От: Pzz Россия https://github.com/alexpevzner
Дата: 29.01.22 18:57
Оценка: 1 (1)
Здравствуйте, Shmj, Вы писали:

S>
S>socket.receive([socket](std::vector<unsigned char> data) {
S>  auto task = Async(process1, data);
S>  process(data);
S>  task.wait();

S>  socket.send(data, kNoCallback);
S>});
S>


Это анонимная функция (функция есть, а имени у нее нету), описанная прям по месту использования. В нонешнем C++ и не такое бывает.
Re[2]: Не распарсил конструкцию с []
От: T4r4sB Россия  
Дата: 29.01.22 20:52
Оценка:
Здравствуйте, 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 ещё и не давал структуры с методами имплементировать внутри тела функции, требовал вытаскивать кишки наружу.
Я к тому, чтоб ТС оценил удобство.
Отредактировано 29.01.2022 20:53 T4r4sB . Предыдущая версия .
Re[3]: Не распарсил конструкцию с []
От: Pzz Россия https://github.com/alexpevzner
Дата: 29.01.22 20:56
Оценка:
Здравствуйте, T4r4sB, Вы писали:

Pzz>>Это анонимная функция (функция есть, а имени у нее нету), описанная прям по месту использования. В нонешнем C++ и не такое бывает.


TB>Не функция, а функтор. Класс с перегруженным оператором ().


Ну я понимаю, что в сишном рантайме настоящую функцию на ходу не создашь. Но логически это именно функция.
Re[4]: Не распарсил конструкцию с []
От: T4r4sB Россия  
Дата: 29.01.22 21:01
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Ну я понимаю, что в сишном рантайме настоящую функцию на ходу не создашь. Но логически это именно функция.


С невидимым первым параметром, который конструируется по месту на основе того, что перечислено в списке захвата.
Re[5]: Не распарсил конструкцию с []
От: Андрей Тарасевич Беларусь  
Дата: 29.01.22 21:54
Оценка: 6 (1) +1
Здравствуйте, Marty, Вы писали:

M>Здравствуйте, Андрей Тарасевич, Вы писали:



АТ>>С тем учтонением, что если "общее указание" — захват по ссылке, то конкретные перемнные можно указать только для захвата по значению. И наоборот.


M>Разве?


Именно так.

[&, i] — допустимо. Общий захват — по ссылке, i — по значению.
[&, &i] — ошибка. Нельзя захватывать i по ссылке, если общий захват и так по ссылке.
[=, i] — ошибка. Нельзя захватывать i по значению, если общий захват и так по значению.
[=, &i] — допустимо. Общий захват — по значению, i — по ссылке.

http://eel.is/c++draft/expr.prim.lambda#capture-2
http://coliru.stacked-crooked.com/a/9fd6075650e3b6b8
Best regards,
Андрей Тарасевич
http://files.rsdn.org/2174/val.gif
Отредактировано 29.01.2022 21:57 Андрей Тарасевич . Предыдущая версия .
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.