Нет, не блокирует. Концептуально вы можете думать о подписи так (хотя это не настоящая подпись):
template <typename T>
template <typename TResult>
Future<TResult> Future<T>::thenValue(std::function<TResult(T&&)> callback) { ... }
Основная идея c состоит в том, что если будущее, представленное std::move(A)
, будет успешным, переданный обратный вызов (B
) будет выполнено, передав значение, созданное A
future. Возвращаемое значение обратного вызова становится результатом будущего, возвращаемого thenValue()
.
Если вы визуальный человек (как и я), возможно, вам поможет маркировка частей подписи:
template <typename T>
template <typename TResult>
Future<TResult> Future<T>::thenValue(std::function<TResult(T&&)> callback) { ... }
^^^^^^^^^^^^^^^ ^^^^^^^^^ ^^^^^^^^
3 1 2
- Будущее, в котором вы вызываете
thenValue
. - Функция обратного вызова, которую вы передаете
thenValue
. - Будущее, возвращаемое
thenValue
.
Когда (1) дает успешный результат, (2) вызывается с этим результатом. Когда (2) возвращается, (3) производит возвращаемое значение (2).
Future (3) создается синхронно, но обратный вызов (2) вызывается асинхронно.