Что делает этот size_t в лямбде? C ++ code

Colin Sivak спросил: 13 июня 2018 в 07:58 в: c++

Я новичок в программировании на C ++, и я наткнулся на этот синтаксис. Может ли кто-нибудь объяснить точку size_t в этом синтаксисе?

// Close the file stream.
.then([=](size_t)
{
    return fileStream->close();
});

4 ответа

Colin Sivak ответил: 13 июня 2018 в 08:02
Я понимаю, что это тип, но если он не используется в функции и поэтому не называется, то в чем его смысл?
R Sahu ответил: 13 июня 2018 в 08:08

Это тип аргумента, переданного функции. Аргумент не используется в функции. Следовательно, он не назван. Существует только тип аргумента.

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

R Sahu ответил: 13 июня 2018 в 08:03
@ColinSivak, он используется клиентом, который ожидает, что функция примет аргумент. Клиент не несет ответственности за то, как используется аргумент или он вообще используется.
fievel ответил: 13 июня 2018 в 08:03
Я бы посоветовал прочитать немного документации о лямбдах. Например: ru.cppreference.com/w/cpp/language/lambda
dev65 ответил: 13 июня 2018 в 09:42

Это похоже на обратные вызовы, в которых ваш обратный вызов принимает данные от вызывающего абонента, и вы делаете все, что хотите, с данными. Поэтому, если вам не нужны данные, вы можете пропустить присвоение имени параметру, поскольку оно не указано. Вы можете увидеть больше примеров обратных вызовов чтение документации некоторых функций winapi, особенно перечисляющих вещи. например EnumWindows, EnumChildWindows EnumProc ....

Arcinde ответил: 13 июня 2018 в 10:34

Как говорили другие, выражение lambda

[=](size_t)
{
    return fileStream->close();
}

передается вызову метода

.then()

Чтобы пролить некоторые дополнительные light: обычно метод .then() является частью интерфейса обратного вызова Futures. Метод then() вызывается в объекте Future<T>, где T - это некоторый тип. Он будет ожидать параметра обратного вызова. Это приводит к цепочке обратного вызова: когда выполняется Future<T>, мы будем иметь T, и на этот момент обратный вызов вызывается с помощью этого T.

В вашем случае T = size_t. Предположительно, объект Future, вызываемый .then(), возвращает size_t, который затем передается в lambda [=] (size_t) { ... }. Затем lambda отбрасывает size_t, потому что он не нужен.

Какой смысл использовать параметр size_t, если он не нужен? Ну, может быть, оригинальный Future объект был своего рода прочитанным вызовом, и он сохранил результат где-то в другом месте (т. Е. Работа выполняется по побочному эффекту) и вернула количество прочитанных байтов (код size_t). Но обратный вызов просто выполняет некоторую работу по очистке и не заботится о том, что было прочитано. Это было бы похоже на следующий синхронный код:

size_t readFile(char* buf) {
    // ... store stuff in buf
    return bytesRead;
}auto closeFileStream(size_t) {
    return fileStream->close();
}closeFileStream(readFile(&buf));

В терминах Futures это, вероятно, нечто большее:

Future<size_t> readFile(char* buf) {
    // ... asynchronously store stuff in buf
    // and return bytesRead as a Future
}auto closeFileStream(size_t) {
    return fileStream->close();
}readFile(&buf)
    .then(closeFileStream)
    .get(); // wait synchronously

Дополнительное видео по вопросу: Что делает этот size_t в лямбде? C ++ code

C# - Lambda Expression

Lambda Expression in Java 8

Почему ломается лямбда зонд❓ Может ли прошивка ЭБУ убить лямбду❓